rulemorph 0.3.2

YAML-based declarative data transformation engine for CSV/JSON to JSON
Documentation
mod infer;
mod render;
mod schema;
mod support;

use self::render::{
    render_go, render_java, render_kotlin, render_python, render_rust, render_swift,
    render_typescript,
};
use self::schema::build_schema;
use self::support::safe_type_name;
use crate::model::RuleFile;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DtoLanguage {
    Rust,
    TypeScript,
    Python,
    Go,
    Java,
    Kotlin,
    Swift,
}

#[derive(Debug, Clone)]
pub struct DtoError {
    message: String,
}

impl DtoError {
    fn new(message: impl Into<String>) -> Self {
        Self {
            message: message.into(),
        }
    }
}

impl std::fmt::Display for DtoError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.message)
    }
}

impl std::error::Error for DtoError {}

pub fn generate_dto(
    rule: &RuleFile,
    language: DtoLanguage,
    name: Option<&str>,
) -> Result<String, DtoError> {
    let name = safe_type_name(language, name.unwrap_or("Record"));
    let schema = build_schema(rule)?;

    match language {
        DtoLanguage::Rust => render_rust(&schema, &name),
        DtoLanguage::TypeScript => render_typescript(&schema, &name),
        DtoLanguage::Python => render_python(&schema, &name),
        DtoLanguage::Go => render_go(&schema, &name),
        DtoLanguage::Java => render_java(&schema, &name),
        DtoLanguage::Kotlin => render_kotlin(&schema, &name),
        DtoLanguage::Swift => render_swift(&schema, &name),
    }
}