use std::path::PathBuf; use crate::error::CustomError; use super::RenderContext; #[derive(Debug)] pub(crate) enum Dependency { StaticFile { absolute_path: PathBuf }, CssFile { name: String }, } impl Dependency { pub(crate) async fn perform( &self, render_context: RenderContext<'_>, ) -> Result<(), CustomError> { match self { Dependency::StaticFile { absolute_path } => { let input_root_directory = render_context.config.get_root_directory(); let relative_path_to_file = absolute_path.strip_prefix(input_root_directory)?; let path_to_output = render_context .output_root_directory .join(relative_path_to_file); tokio::fs::create_dir_all( path_to_output .parent() .ok_or("Output file should have a containing directory.")?, ) .await?; if tokio::fs::metadata(&path_to_output).await.is_ok() { // TODO: compare hash and error out if they do not match. println!( "Not copying {} to {} because the output file already exists.", absolute_path.display(), path_to_output.display() ); } else { tokio::fs::copy(absolute_path, path_to_output).await?; } Ok(()) } Dependency::CssFile { name: _ } => { // We don't do anything because the CSS files are already copied into the output from natter's default environment. // TODO: When we add support for CSS outside the default environment, we should add support for dynamically picking which ones to copy here. Ok(()) } } } }