use crate ::
{
TemplateValue,
TemplateRenderer,
FileSystem,
Values,
FileDescriptor,
WriteMode,
Error,
};
#[ derive( Debug ) ]
pub struct Template< V, R, FS >
where
V: TemplateValue + serde ::Serialize + serde ::de ::DeserializeOwned,
R: TemplateRenderer,
FS: FileSystem,
{
values: Values< V >,
files: Vec< FileDescriptor >,
renderer: R,
filesystem: FS,
}
impl< V, R, FS > Template< V, R, FS >
where
V: TemplateValue + serde ::Serialize + serde ::de ::DeserializeOwned,
R: TemplateRenderer,
FS: FileSystem,
{
pub fn new( renderer: R, filesystem: FS ) -> Self
{
Self
{
values: Values ::new(),
files: Vec ::new(),
renderer,
filesystem,
}
}
pub fn insert_value( &mut self, key: &str, value: V )
{
self.values.insert( key, value );
}
pub fn has_value( &self, key: &str ) -> bool
{
self.values.has_value( key )
}
pub fn add_file( &mut self, descriptor: FileDescriptor )
{
self.files.push( descriptor );
}
pub fn materialize( &mut self ) -> Result< (), Error >
{
let serialized_values = self.values.to_serializable();
for file_desc in &self.files
{
let template_content = self.filesystem.read( &file_desc.template_path )?;
let rendered = self.renderer.render( &template_content, &serialized_values )?;
match file_desc.write_mode
{
WriteMode ::Rewrite =>
{
self.filesystem.write( &file_desc.file_path, &rendered )?;
}
WriteMode ::TomlExtend =>
{
self.filesystem.write( &file_desc.file_path, &rendered )?;
}
}
}
Ok(())
}
pub fn filesystem( &self ) -> &FS
{
&self.filesystem
}
}