molecule_codegen/generator/languages/
mod.rs1use 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}