52 lines
1.9 KiB
Rust
52 lines
1.9 KiB
Rust
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(())
|
|
}
|
|
}
|
|
}
|
|
}
|