use std::{ env, fs::{self, OpenOptions}, io::{self, Write}, path::PathBuf, process::Command, }; use inquire::Text; use temp_file::{TempFile, TempFileBuilder}; use crate::md::{Entry, ToMd}; // TODO: the usual (better error handling) pub fn add_entry(path: PathBuf, title: Option) -> io::Result<()> { if !path.exists() { eprintln!("Journal file does not exist at {path:?}, exiting..."); std::process::exit(1); } let title = Text::new("Title").prompt().unwrap(); let tmp = TempFileBuilder::new() .suffix(".jrnl-entry.md") .build() .unwrap(); let editor = match env::var("EDITOR") { Ok(val) => val, Err(env::VarError::NotPresent) => { eprintln!("EDITOR not set, exiting..."); std::process::exit(1); } _ => unreachable!(), }; let mut editor_cmd = Command::new(&editor); editor_cmd.arg(tmp.path()); editor_cmd.status().unwrap(); let content = fs::read_to_string(tmp.path()).unwrap(); let now = chrono::offset::Local::now(); let entry = Entry { timestamp: now.fixed_offset(), title: &title, content: &content, }; let mut file = OpenOptions::new() .write(true) .append(true) .open(path) .unwrap(); write!(file, "{}", entry.to_md())?; Ok(()) }