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}
20
21/// Parse a CSV/list of language names (case-insensitive) into Language values.
22pub fn parse_languages(values: &[String]) -> anyhow::Result<Vec<Language>> {
23    let mut langs = Vec::new();
24    for value in values {
25        for raw in value.split(',') {
26            let name = raw.trim();
27            if name.is_empty() {
28                continue;
29            }
30            let lang = Language::from_str(name).ok_or_else(|| {
31                anyhow::anyhow!(
32                    "unknown language '{}'. Supported: typescript, python, go, swift, kotlin",
33                    name
34                )
35            })?;
36            if !langs.contains(&lang) {
37                langs.push(lang);
38            }
39        }
40    }
41    Ok(langs)
42}
43
44pub fn all_languages() -> Vec<Language> {
45    vec![
46        Language::TypeScript,
47        Language::Python,
48        Language::Go,
49        Language::Swift,
50        Language::Kotlin,
51    ]
52}