use std::{
fs,
path::{Path, PathBuf},
};
use crate::parser::parse_trixy_lang;
use crate::types::C_TYPE_HEADER;
use config::{
file_tree::{FileTree, GeneratedFile},
trixy::Language,
};
use self::config::trixy::TrixyConfig;
pub mod config;
mod generate;
const VIM_LINE_RUST: &'static str = "// vim: filetype=rust\n";
const VIM_LINE_C: &'static str = "// vim: filetype=c\n";
impl TrixyConfig {
#[must_use]
pub fn generate(&self) -> FileTree {
let mut file_tree = FileTree::new();
let source_code = fs::read_to_string(&self.trixy_path).unwrap_or_else(|err| {
panic! {"Can't read file at path: '{}'. The Error was: '{}'", self.trixy_path.display(), err};
});
let trixy_code = parse_trixy_lang(&source_code).unwrap_or_else(|err| {
panic! {"Parsing of the trixy file failed: \n{}", err}
});
if self.generate_host {
let host_code = generate::host::generate(&trixy_code, &self);
file_tree.add_host_file(GeneratedFile::new_in_out_dir(
self.host_code_name.clone(),
host_code,
Language::Rust,
&self.out_dir_path,
));
}
if self.generate_auxiliary {
let c_header = generate::auxiliary::generate(&trixy_code, &self);
if let Some(dist_dir) = &self.dist_dir_path {
let c_header_dist =
PathBuf::from(format!("{}/{}", dist_dir.display(), &self.c_header_name));
file_tree.add_auxiliary_file(GeneratedFile::new(
c_header_dist,
c_header,
Language::C,
));
if self.add_c_headers {
C_TYPE_HEADER
.iter()
.for_each(|(name, content)| {
let path: &Path = &Path::new(name);
let header_path =
PathBuf::from(format!("{}/{}", dist_dir.display(), path.display()));
file_tree.add_auxiliary_file(GeneratedFile::new(
header_path,
content.to_string(),
Language::C,
));
});
}
}
}
file_tree
}
}