use std::{
fs, io,
path::{Path, PathBuf},
};
use super::trixy::Language;
pub mod markdown_representation;
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct FileTree {
pub host_files: Vec<GeneratedFile>,
pub auxiliary_files: Vec<GeneratedFile>,
}
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct GeneratedFile {
pub path: PathBuf,
pub value: String,
pub language: Language,
}
impl GeneratedFile {
pub fn new(path: PathBuf, value: String, language: Language) -> Self {
Self {
path,
value,
language,
}
}
pub fn new_in_out_dir(name: String, value: String, language: Language, out_dir: &Path) -> Self {
let path = out_dir.join(name);
Self {
path,
value,
language,
}
}
pub fn materialize(self) -> io::Result<()> {
fs::create_dir_all(self.path.parent().expect("This path should have a parent"))?;
fs::write(self.path, self.value.as_bytes())?;
Ok(())
}
}
impl FileTree {
pub fn new() -> Self {
Self::default()
}
pub fn add_host_file(&mut self, file: GeneratedFile) {
self.host_files.push(file)
}
pub fn add_auxiliary_file(&mut self, file: GeneratedFile) {
self.auxiliary_files.push(file)
}
pub fn extend_host(&mut self, files: Vec<GeneratedFile>) {
files.into_iter().for_each(|file| self.add_host_file(file));
}
pub fn extend_auxiliary(&mut self, files: Vec<GeneratedFile>) {
files
.into_iter()
.for_each(|file| self.add_auxiliary_file(file));
}
pub fn materialize(self) -> io::Result<()> {
self.host_files
.into_iter()
.map(|file| -> io::Result<()> { file.materialize() })
.collect::<io::Result<()>>()?;
self.auxiliary_files
.into_iter()
.map(|file| -> io::Result<()> { file.materialize() })
.collect::<io::Result<()>>()?;
Ok(())
}
}