Skip to main content

typewriter_engine/
lib.rs

1//! Shared parser/emitter engine used by both proc-macro and CLI flows.
2
3pub mod drift;
4pub mod emit;
5pub mod parser;
6pub mod project;
7pub mod scan;
8
9use std::path::PathBuf;
10
11pub use typewriter_core::{config::TypewriterConfig, ir::Language, ir::TypeDef};
12
13/// Parsed TypeWriter definition discovered in a Rust source file.
14#[derive(Debug, Clone)]
15pub struct TypeSpec {
16    pub type_def: TypeDef,
17    pub targets: Vec<Language>,
18    pub source_path: PathBuf,
19    pub zod_schema: Option<bool>,
20}
21
22/// Parse a CSV/list of language names (case-insensitive) into Language values.
23pub fn parse_languages(values: &[String]) -> anyhow::Result<Vec<Language>> {
24    let mut langs = Vec::new();
25    for value in values {
26        for raw in value.split(',') {
27            let name = raw.trim();
28            if name.is_empty() {
29                continue;
30            }
31            let lang = Language::from_str(name).ok_or_else(|| {
32                anyhow::anyhow!(
33                    "unknown language '{}'. Supported: typescript, python, go, swift, kotlin",
34                    name
35                )
36            })?;
37            if !langs.contains(&lang) {
38                langs.push(lang);
39            }
40        }
41    }
42    Ok(langs)
43}
44
45pub fn all_languages() -> Vec<Language> {
46    vec![
47        Language::TypeScript,
48        Language::Python,
49        Language::Go,
50        Language::Swift,
51        Language::Kotlin,
52    ]
53}