diff --git a/Cargo.lock b/Cargo.lock index 0f5224e..ee90c5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -369,7 +369,9 @@ dependencies = [ "clap", "clap_complete", "clap_mangen", - "comline-codelib-gen", + "comline-codegen", + "comline-codegen-rust", + "comline-codegen-typescript", "comline-core", "indicatif", "libc", @@ -385,13 +387,32 @@ dependencies = [ ] [[package]] -name = "comline-codelib-gen" +name = "comline-codegen" version = "0.1.0" -source = "git+https://github.com/ComlineProject/generation?rev=c1f86392f50f60b5df3d648b158426628d8ed802#c1f86392f50f60b5df3d648b158426628d8ed802" +source = "git+https://github.com/ComlineProject/generation?rev=8ff03d7a8ca5f5e65befcb52728863b254eb4128#8ff03d7a8ca5f5e65befcb52728863b254eb4128" dependencies = [ "comline-core", "eyre", - "once_cell", +] + +[[package]] +name = "comline-codegen-rust" +version = "0.1.0" +source = "git+https://github.com/ComlineProject/generation?rev=8ff03d7a8ca5f5e65befcb52728863b254eb4128#8ff03d7a8ca5f5e65befcb52728863b254eb4128" +dependencies = [ + "comline-codegen", + "comline-core", + "eyre", +] + +[[package]] +name = "comline-codegen-typescript" +version = "0.1.0" +source = "git+https://github.com/ComlineProject/generation?rev=8ff03d7a8ca5f5e65befcb52728863b254eb4128#8ff03d7a8ca5f5e65befcb52728863b254eb4128" +dependencies = [ + "comline-codegen", + "comline-core", + "eyre", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6e71a2a..d10e51c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,10 +23,12 @@ tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter", "fmt"] } serde = { version = "1", features = ["derive"] } toml = "0.8" -# git rev (not crates.io 0.1.0) so this and `comline-codelib-gen` share one +# git rev (not crates.io) so this and the `comline-codegen*` crates share one # `comline-core` in the tree. Local dev: see .cargo/config. comline-core = { git = "https://github.com/ComlineProject/core", rev = "aa84d970d3295df59cc3e620bdb71bf96382f97b" } -comline-codelib-gen = { git = "https://github.com/ComlineProject/generation", rev = "c1f86392f50f60b5df3d648b158426628d8ed802" } +comline-codegen = { git = "https://github.com/ComlineProject/generation", rev = "8ff03d7a8ca5f5e65befcb52728863b254eb4128" } +comline-codegen-rust = { git = "https://github.com/ComlineProject/generation", rev = "8ff03d7a8ca5f5e65befcb52728863b254eb4128" } +comline-codegen-typescript = { git = "https://github.com/ComlineProject/generation", rev = "8ff03d7a8ca5f5e65befcb52728863b254eb4128" } [target.'cfg(unix)'.dependencies] libc = "0.2" diff --git a/src/commands/clean.rs b/src/commands/clean.rs index c9ad99b..8676384 100644 --- a/src/commands/clean.rs +++ b/src/commands/clean.rs @@ -92,6 +92,7 @@ pub(crate) fn generated_files(work_dir: &Path) -> Vec { return Vec::new(); }; + let registry = super::generate::generator_registry(); let mut files = Vec::new(); for t in &targets { // A dedicated output directory: remove it wholesale (stale files too). @@ -102,9 +103,7 @@ pub(crate) fn generated_files(work_dir: &Path) -> Vec { // Output lands among the sources — only touch the exact files. This // covers the single-version (`latest`) case; a multi-version tree lives // under a dedicated `out` dir and is removed by the branch above. - let Some((_, ext)) = - comline_codelib_gen::code_gen::find_generator(&t.language, &t.lang_version) - else { + let Some((_, ext)) = registry.find(&t.language, &t.lang_version) else { continue; }; for schema_ctx in &context.schema_contexts { diff --git a/src/commands/generate.rs b/src/commands/generate.rs index fc2d77b..bb74a72 100644 --- a/src/commands/generate.rs +++ b/src/commands/generate.rs @@ -12,7 +12,7 @@ use std::collections::HashMap; use std::path::Path; -use comline_codelib_gen::code_gen::{self, GenRequest, Mode, PackageMeta}; +use comline_codegen::{GenRequest, Mode, PackageMeta, Registry}; use comline_core::package::build::{self, cas::ObjectStore}; use comline_core::package::config::ir::frozen::FrozenUnit as ConfigUnit; use comline_core::schema::idl::constants::SCHEMA_EXTENSION; @@ -23,6 +23,15 @@ use crate::commands::{core_err, ensure_project}; use crate::gen_config::{self, ComlineToml, DeclaredLang, Overrides, VersionSpec}; use crate::{history, ui, watch}; +/// The generator registry, composed from the per-language `comline-codegen-*` +/// crates this CLI was built with. (Feature-gating the set is rollout step 6.) +pub(crate) fn generator_registry() -> Registry { + let mut registry = Registry::new(); + comline_codegen_rust::register(&mut registry); + comline_codegen_typescript::register(&mut registry); + registry +} + pub fn run(work_dir: &Path, overrides: &Overrides, watching: bool) -> Result<()> { ensure_project(work_dir)?; @@ -93,6 +102,8 @@ fn generate_once(work_dir: &Path, overrides: &Overrides) -> Result<()> { let targets = gen_config::resolve(&cfg, &declared, work_dir, overrides)?; + let registry = generator_registry(); + let mut written = 0usize; for t in &targets { let mode = match t.mode.as_str() { @@ -106,7 +117,7 @@ fn generate_once(work_dir: &Path, overrides: &Overrides) -> Result<()> { } }; - let Some((generator, ext)) = code_gen::find_generator(&t.language, &t.lang_version) else { + let Some((generator, ext)) = registry.find(&t.language, &t.lang_version) else { return Err(miette!( "no generator for `{}` (version `{}`)", t.language,