dia_core 0.1.0

core elements of dia
Documentation
use crate::{
    ast::{Choice, Module, Node, NodeName, SubNode, Text, TsExpression, TsModule},
    traits::Codegen,
};

impl Codegen for TsModule {
    fn generate(&self) -> String {
        self.raw().into()
    }
}

impl Codegen for TsExpression {
    fn generate(&self) -> String {
        self.raw().into()
    }
}

impl Codegen for Text {
    fn generate(&self) -> String {
        self.chunks().join("")
    }
}

impl Codegen for NodeName {
    fn generate(&self) -> String {
        self.as_str().into()
    }
}

impl Codegen for Choice {
    fn generate(&self) -> String {
        let text = self.text().generate();
        let then = self.then().as_ref().map(|then| then.generate());

        let mut code = "\n- ".to_string();

        code.push_str(&match then {
            Some(then) => format!("{} => {}", text, then),
            None => text,
        });

        code
    }
}

impl Codegen for SubNode {
    fn generate(&self) -> String {
        let mut code = self.text().generate();

        for choice in self.choices() {
            code.push_str(&choice.generate());
        }

        code
    }
}

impl Codegen for Node {
    fn generate(&self) -> String {
        let mut code = String::new();
        for sub_node in self.sub_nodes() {
            code.push_str(&sub_node.generate());
        }
        code
    }
}

impl Codegen for Module {
    fn generate(&self) -> String {
        let mut code = String::new();
        for (name, node) in self.nodes() {
            code.push_str(&format!("--- {} ---\n", name.generate()));
            code.push_str(&node.generate());
            code.push('\n');
        }
        code
    }
}