diff options
-rw-r--r-- | src/file_tree/mod.rs | 47 | ||||
-rw-r--r-- | src/new/section.rs | 6 |
2 files changed, 43 insertions, 10 deletions
diff --git a/src/file_tree/mod.rs b/src/file_tree/mod.rs index d6f0c3c..96637b3 100644 --- a/src/file_tree/mod.rs +++ b/src/file_tree/mod.rs @@ -24,10 +24,13 @@ //! you. use std::{ - fs, io, + fs::{self, File}, + io, path::{Path, PathBuf}, }; +use anyhow::bail; + /// A file tree containing all files that were generated. These are separated into host and /// auxiliary files. See their respective descriptions about what differentiates them. #[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord)] @@ -47,18 +50,48 @@ pub struct GeneratedFile { /// /// This should already be formatted and ready to be used. pub value: String, + + /// Whether to override this file silently, if it already exists. + pub clobber: bool, } impl GeneratedFile { pub fn new(path: PathBuf, value: String) -> Self { - Self { path, value } + Self { + path, + value, + clobber: true, + } + } + pub fn new_clobber(path: PathBuf, value: String, clobber: bool) -> Self { + Self { + path, + value, + clobber, + } } pub fn new_in_out_dir(name: String, value: String, out_dir: &Path) -> Self { let path = out_dir.join(name); - Self { path, value } + Self { + path, + value, + clobber: true, + } } - pub fn materialize(self) -> io::Result<()> { + pub fn materialize(self) -> anyhow::Result<()> { + if !self.clobber { + // Check if the file exists + if self.path.try_exists()? { + bail!( + "Path at '{}' already exists,\n \ + but I don't want to override the file there!\n \ + Please move it out of the way manually.", + self.path.display() + ) + } + } + fs::create_dir_all(self.path.parent().expect("This path should have a parent"))?; fs::write(self.path, self.value.as_bytes())?; Ok(()) @@ -78,11 +111,11 @@ impl FileTree { files.into_iter().for_each(|file| self.add_file(file)); } - pub fn materialize(self) -> io::Result<()> { + pub fn materialize(self) -> anyhow::Result<()> { self.files .into_iter() - .map(|file| -> io::Result<()> { file.materialize() }) - .collect::<io::Result<()>>()?; + .map(|file| -> anyhow::Result<()> { file.materialize() }) + .collect::<anyhow::Result<()>>()?; Ok(()) } } diff --git a/src/new/section.rs b/src/new/section.rs index 86d347c..bfa2b2c 100644 --- a/src/new/section.rs +++ b/src/new/section.rs @@ -39,13 +39,13 @@ pub fn generate_new_section( ), ); - let new_section_file = GeneratedFile::new( + file_tree.add_file(GeneratedFile::new_clobber( chapter_root .join("sections") .join(format!("{}.tex", MangledName::new(&name))), new_section_text, - ); - file_tree.add_file(new_section_file); + false, + )); let chapter_file_path = chapter_root.join("chapter.tex"); let mut chapter_file_text = fs::read_to_string(&chapter_file_path).with_context(|| { |