use std::{ fs, path::Path, time::{SystemTime, UNIX_EPOCH}, }; use anyhow::Context; use chrono::{Local, TimeDelta, TimeZone}; use log::debug; use crate::{ config_file::Config, file_tree::{FileTree, GeneratedFile}, new::MangledName, }; fn get_current_date() -> String { let start = SystemTime::now(); let seconds_since_epoch: TimeDelta = TimeDelta::from_std( start .duration_since(UNIX_EPOCH) .expect("Time went backwards"), ) .expect("Time does not go backwards"); debug!( "Adding a date with timestamp: {}", seconds_since_epoch.num_seconds() ); let our_date = format!( "{}", Local .timestamp_opt(seconds_since_epoch.num_seconds(), 0) // only has unwrap, no expect. But should always work .unwrap() .format("%Y-%m-%d %H:%M:%S%.f %:z") ); // let date = Command::new("date") // .args(["-d", &format!("@{}", seconds_since_epoch.num_seconds())]) // .output() // .unwrap() // .stdout; // info!( // "This is dated: '{}' vs. our date: '{}'", // String::from_utf8(date).unwrap().strip_suffix('\n').unwrap(), // our_date // ); our_date } pub fn generate_new_section( config: &Config, name: String, project_root: &Path, chapter_name: &str, ) -> anyhow::Result { 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", &get_current_date()); file_tree.add_file(GeneratedFile::new_clobber( chapter_root .join("sections") .join(format!("{}.tex", MangledName::new(&name))), new_section_text, false, )); 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, &MangledName::new(&name) )); let chapter_file = GeneratedFile::new(chapter_file_path, chapter_file_text); file_tree.add_file(chapter_file); Ok(file_tree) }