diff --git a/src/command/build/runner.rs b/src/command/build/runner.rs index 9ca5f4a..b6ed39a 100644 --- a/src/command/build/runner.rs +++ b/src/command/build/runner.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use crate::blog_post::BlogPost; use crate::cli::parameters::BuildArgs; use crate::config::Config; @@ -7,6 +9,7 @@ use walkdir::WalkDir; pub(crate) async fn build_site(args: BuildArgs) -> Result<(), CustomError> { let config = Config::load_from_file(args.config).await?; let root_directory = config.get_root_directory().to_owned(); + let output_directory = get_output_directory(&config).await?; let post_directories = WalkDir::new(config.get_posts_directory()) .into_iter() .filter(|e| match e { @@ -26,3 +29,22 @@ pub(crate) async fn build_site(args: BuildArgs) -> Result<(), CustomError> { println!("{:?}", blog_posts); Ok(()) } + +/// Delete everything inside the output directory and return the path to that directory. +async fn get_output_directory(config: &Config) -> Result { + let output_directory = config.get_output_directory(); + if !output_directory.exists() { + tokio::fs::create_dir(&output_directory).await?; + } else { + let mut existing_entries = tokio::fs::read_dir(&output_directory).await?; + while let Some(entry) = existing_entries.next_entry().await? { + let file_type = entry.file_type().await?; + if file_type.is_dir() { + tokio::fs::remove_dir_all(entry.path()).await?; + } else { + tokio::fs::remove_file(entry.path()).await?; + } + } + } + Ok(output_directory) +} diff --git a/src/config/full.rs b/src/config/full.rs index c2aeb61..0e499f7 100644 --- a/src/config/full.rs +++ b/src/config/full.rs @@ -55,4 +55,8 @@ impl Config { pub(crate) fn get_posts_directory(&self) -> PathBuf { self.get_root_directory().join("posts") } + + pub(crate) fn get_output_directory(&self) -> PathBuf { + self.get_root_directory().join("output") + } }