molecule_codegen/generator/languages/
mod.rs

1use std::{convert::TryFrom, fmt, io};
2
3use crate::ast;
4
5mod c;
6pub(crate) mod rust;
7mod rust_lazy_reader;
8
9#[derive(Debug, Clone, Copy)]
10pub enum Language {
11    C,
12    Rust,
13    RustLazyReader,
14}
15
16pub(super) trait LanguageGenerator {
17    fn generate<W: io::Write>(writer: &mut W, ast: &ast::Ast) -> io::Result<()>;
18}
19
20impl fmt::Display for Language {
21    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
22        match *self {
23            Self::C => write!(f, "C"),
24            Self::Rust => write!(f, "Rust"),
25            Self::RustLazyReader => write!(f, "Rust(Lazy Reader)"),
26        }
27    }
28}
29
30impl TryFrom<&str> for Language {
31    type Error = String;
32    fn try_from(value: &str) -> Result<Self, Self::Error> {
33        match value.to_lowercase().as_str() {
34            "c" => Ok(Self::C),
35            "rust" => Ok(Self::Rust),
36            "rust-lazy-reader" => Ok(Self::RustLazyReader),
37            lang => Err(format!("unsupported language: [{}]", lang)),
38        }
39    }
40}
41
42impl Language {
43    pub(crate) fn extension(self) -> &'static str {
44        match self {
45            Self::C => "h",
46            Self::Rust => "rs",
47            Self::RustLazyReader => "rs",
48        }
49    }
50
51    pub(crate) fn generate<W: io::Write>(self, writer: &mut W, ast: &ast::Ast) -> io::Result<()> {
52        match self {
53            Self::C => c::Generator::generate(writer, ast),
54            Self::Rust => rust::Generator::generate(writer, ast),
55            Self::RustLazyReader => rust_lazy_reader::Generator::generate(writer, ast),
56        }
57    }
58}