use std::{fs, path::Path, time::SystemTime}; use anyhow::Context; use chrono::{DateTime, Local}; use convert_case::{Case, Casing}; use log::debug; use crate::{ config_file::Config, file_tree::{FileTree, GeneratedFile}, }; pub fn generate_new_section( config: &Config, name: String, project_root: &Path, chapter_name: &str, ) -> anyhow::Result<FileTree> { let chapter_root = project_root.join("content").join(chapter_name); debug!("Chapter root is: {}", chapter_root.display()); let mut file_tree = FileTree::new(); let new_section_text = config .templates .section .replace("REPLACMENT_SECTION_TITLE", &name) .replace( "DATE", &format!( "{}", // FIXME: The time is not really precise enough to display the time. <2024-03-31> DateTime::<Local>::from(SystemTime::now()).format("%Y-%m-%d (%_H:%_S)") ), ); let new_section_file = GeneratedFile::new( chapter_root .join("sections") .join(format!("{}.tex", name.to_case(Case::Snake))), new_section_text, ); file_tree.add_file(new_section_file); let chapter_file_path = chapter_root.join("chapter.tex"); let mut chapter_file_text = fs::read_to_string(&chapter_file_path).with_context(|| { format!( "Failed to read the chapter main file ('{}') to string", &chapter_file_path.display(), ) })?; chapter_file_text.push_str(&format!( "\\input{{content/{}/sections/{}}}\n", chapter_name, &name.to_case(Case::Snake) )); let chapter_file = GeneratedFile::new(chapter_file_path, chapter_file_text); file_tree.add_file(chapter_file); Ok(file_tree) }