diff --git a/generated/cargo-gpu/Cargo.toml b/generated/graphics/cargo-gpu/Cargo.toml similarity index 100% rename from generated/cargo-gpu/Cargo.toml rename to generated/graphics/cargo-gpu/Cargo.toml diff --git a/generated/cargo-gpu/ash/Cargo.toml b/generated/graphics/cargo-gpu/ash/Cargo.toml similarity index 100% rename from generated/cargo-gpu/ash/Cargo.toml rename to generated/graphics/cargo-gpu/ash/Cargo.toml diff --git a/generated/cargo-gpu/ash/build.rs b/generated/graphics/cargo-gpu/ash/build.rs similarity index 100% rename from generated/cargo-gpu/ash/build.rs rename to generated/graphics/cargo-gpu/ash/build.rs diff --git a/generated/cargo-gpu/ash/src/device.rs b/generated/graphics/cargo-gpu/ash/src/device.rs similarity index 100% rename from generated/cargo-gpu/ash/src/device.rs rename to generated/graphics/cargo-gpu/ash/src/device.rs diff --git a/generated/cargo-gpu/ash/src/graphics.rs b/generated/graphics/cargo-gpu/ash/src/graphics.rs similarity index 100% rename from generated/cargo-gpu/ash/src/graphics.rs rename to generated/graphics/cargo-gpu/ash/src/graphics.rs diff --git a/generated/cargo-gpu/ash/src/main.rs b/generated/graphics/cargo-gpu/ash/src/main.rs similarity index 100% rename from generated/cargo-gpu/ash/src/main.rs rename to generated/graphics/cargo-gpu/ash/src/main.rs diff --git a/generated/cargo-gpu/ash/src/single_command_buffer.rs b/generated/graphics/cargo-gpu/ash/src/single_command_buffer.rs similarity index 100% rename from generated/cargo-gpu/ash/src/single_command_buffer.rs rename to generated/graphics/cargo-gpu/ash/src/single_command_buffer.rs diff --git a/generated/cargo-gpu/ash/src/swapchain.rs b/generated/graphics/cargo-gpu/ash/src/swapchain.rs similarity index 100% rename from generated/cargo-gpu/ash/src/swapchain.rs rename to generated/graphics/cargo-gpu/ash/src/swapchain.rs diff --git a/generated/cargo-gpu/shaders/Cargo.toml b/generated/graphics/cargo-gpu/shaders/Cargo.toml similarity index 100% rename from generated/cargo-gpu/shaders/Cargo.toml rename to generated/graphics/cargo-gpu/shaders/Cargo.toml diff --git a/generated/cargo-gpu/shaders/src/lib.rs b/generated/graphics/cargo-gpu/shaders/src/lib.rs similarity index 100% rename from generated/cargo-gpu/shaders/src/lib.rs rename to generated/graphics/cargo-gpu/shaders/src/lib.rs diff --git a/generated/spirv-builder/Cargo.toml b/generated/graphics/spirv-builder/Cargo.toml similarity index 100% rename from generated/spirv-builder/Cargo.toml rename to generated/graphics/spirv-builder/Cargo.toml diff --git a/generated/spirv-builder/ash/Cargo.toml b/generated/graphics/spirv-builder/ash/Cargo.toml similarity index 100% rename from generated/spirv-builder/ash/Cargo.toml rename to generated/graphics/spirv-builder/ash/Cargo.toml diff --git a/generated/spirv-builder/ash/build.rs b/generated/graphics/spirv-builder/ash/build.rs similarity index 100% rename from generated/spirv-builder/ash/build.rs rename to generated/graphics/spirv-builder/ash/build.rs diff --git a/generated/spirv-builder/ash/src/device.rs b/generated/graphics/spirv-builder/ash/src/device.rs similarity index 100% rename from generated/spirv-builder/ash/src/device.rs rename to generated/graphics/spirv-builder/ash/src/device.rs diff --git a/generated/spirv-builder/ash/src/graphics.rs b/generated/graphics/spirv-builder/ash/src/graphics.rs similarity index 100% rename from generated/spirv-builder/ash/src/graphics.rs rename to generated/graphics/spirv-builder/ash/src/graphics.rs diff --git a/generated/spirv-builder/ash/src/main.rs b/generated/graphics/spirv-builder/ash/src/main.rs similarity index 100% rename from generated/spirv-builder/ash/src/main.rs rename to generated/graphics/spirv-builder/ash/src/main.rs diff --git a/generated/spirv-builder/ash/src/single_command_buffer.rs b/generated/graphics/spirv-builder/ash/src/single_command_buffer.rs similarity index 100% rename from generated/spirv-builder/ash/src/single_command_buffer.rs rename to generated/graphics/spirv-builder/ash/src/single_command_buffer.rs diff --git a/generated/spirv-builder/ash/src/swapchain.rs b/generated/graphics/spirv-builder/ash/src/swapchain.rs similarity index 100% rename from generated/spirv-builder/ash/src/swapchain.rs rename to generated/graphics/spirv-builder/ash/src/swapchain.rs diff --git a/generated/spirv-builder/rust-toolchain.toml b/generated/graphics/spirv-builder/rust-toolchain.toml similarity index 100% rename from generated/spirv-builder/rust-toolchain.toml rename to generated/graphics/spirv-builder/rust-toolchain.toml diff --git a/generated/spirv-builder/shaders/Cargo.toml b/generated/graphics/spirv-builder/shaders/Cargo.toml similarity index 100% rename from generated/spirv-builder/shaders/Cargo.toml rename to generated/graphics/spirv-builder/shaders/Cargo.toml diff --git a/generated/spirv-builder/shaders/src/lib.rs b/generated/graphics/spirv-builder/shaders/src/lib.rs similarity index 100% rename from generated/spirv-builder/shaders/src/lib.rs rename to generated/graphics/spirv-builder/shaders/src/lib.rs diff --git a/xtask/Cargo.lock b/xtask/Cargo.lock index e952cd5..7d65b19 100644 --- a/xtask/Cargo.lock +++ b/xtask/Cargo.lock @@ -1866,27 +1866,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "syn" version = "2.0.111" @@ -2482,8 +2461,10 @@ dependencies = [ "cargo-generate", "clap", "env_logger", + "indexmap", "log", - "strum", + "serde", + "toml", ] [[package]] diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index d07fb0b..86d66ce 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -7,7 +7,11 @@ edition = "2024" [dependencies] anyhow = "1.0.100" clap = { version = "4.5.53", features = ["derive"] } -strum = { version = "0.27.2", features = ["derive"] } log = "0.4.28" env_logger = "0.11.8" + +# deps below are copied from `cargo-generate` cargo-generate = { version = "0.23.7", default-features = false, features = [] } +serde = { version = "~1.0", features = ["derive"] } +toml = { version = "~0.9", features = ["preserve_order"] } +indexmap = { version = "~2", features = ["serde"] } diff --git a/xtask/src/cargo_generate_config.rs b/xtask/src/cargo_generate_config.rs new file mode 100644 index 0000000..e5da2a2 --- /dev/null +++ b/xtask/src/cargo_generate_config.rs @@ -0,0 +1,28 @@ +//! These definitions are copied from `cargo_generate::config`, since that interface isn't pub. +//! Only keys we need are kept. + +use indexmap::IndexMap; +use serde::Deserialize; +use std::collections::HashMap; + +pub const CONFIG_FILE_NAME: &str = "cargo-generate.toml"; + +#[derive(Deserialize, Debug, PartialEq, Default, Clone)] +pub struct Config { + pub template: Option, + pub placeholders: Option, + pub conditional: Option>, +} + +#[derive(Deserialize, Debug, PartialEq, Eq, Default, Clone)] +pub struct TemplateConfig { + pub sub_templates: Option>, +} + +#[derive(Deserialize, Debug, PartialEq, Clone)] +pub struct ConditionalConfig { + pub placeholders: Option, +} + +#[derive(Deserialize, Debug, PartialEq, Clone, Default)] +pub struct TemplateSlotsTable(pub IndexMap); diff --git a/xtask/src/generate.rs b/xtask/src/generate.rs index 423b629..9130781 100644 --- a/xtask/src/generate.rs +++ b/xtask/src/generate.rs @@ -1,130 +1,267 @@ -use anyhow::Context; +use crate::cargo_generate_config::{CONFIG_FILE_NAME, Config}; +use anyhow::{Context, bail}; use cargo_generate::GenerateArgs; use clap::Parser; -use clap::builder::PossibleValue; +use indexmap::IndexMap; use log::{debug, info}; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::fmt::{Debug, Display, Formatter}; use std::path::{Path, PathBuf}; -use strum::{Display, EnumString, IntoStaticStr, VariantArray}; - -pub const TEMPLATE_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../graphics"); - -/// All possible placeholder *values*. -/// -/// We assume there are no duplicate values for placeholders, so we don't need to type out the key / placeholder name, -/// but can derive the key from the value directly. -#[repr(u32)] -#[derive(Copy, Clone, Eq, PartialEq, Hash, Display, EnumString, IntoStaticStr, VariantArray)] -pub enum Values { - #[strum(to_string = "cargo-gpu")] - CargoGpu, - #[strum(to_string = "spirv-builder")] - SpirvBuilder, + +#[derive(Parser, Debug, Default)] +pub struct Generate { + /// Directory where to place the generated templates. + #[clap(long)] + out: Option, + /// Clean generate, deletes the generated directory before generating templates. Use this when you moved or removed + /// files. + #[clap(long)] + clean: bool, + /// A command that should be executed on each generated template. + /// + /// If a command fails, this process will fail as well, allowing you to test the template output. + #[clap(long, short = 'x')] + execute: Option, + /// Filter for values that any placeholder accepts + /// + /// We assume there are no values that two different placeholders match, within a single template, so we don't have + /// to specify the placeholder the value is associated to. + filter: Vec, } -impl Debug for Values { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - Display::fmt(self, f) - } +#[derive(Clone, Debug)] +struct TemplateDiscovery { + templates: Vec