jrnl: adding entries now works!!

This commit is contained in:
Schrottkatze 2024-04-22 21:25:29 +02:00
parent b967f6e90e
commit aaec1f1f78
Signed by: schrottkatze
SSH key fingerprint: SHA256:hXb3t1vINBFCiDCmhRABHX5ocdbLiKyCdKI4HK2Rbbc
5 changed files with 89 additions and 13 deletions

View file

@ -0,0 +1,68 @@
use std::{
env,
fs::{self, OpenOptions},
io::{self, Write},
path::PathBuf,
process::Command,
};
use temp_file::{TempFile, TempFileBuilder};
use crate::md::{Entry, ToMd};
// TODO: the usual (better error handling)
pub fn add_entry(path: PathBuf, title: Option<String>) -> io::Result<()> {
if !path.exists() {
eprintln!("Journal file does not exist at {path:?}, exiting...");
std::process::exit(1);
}
let title = prompt("Title")?;
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(())
}
fn prompt(title: &str) -> io::Result<String> {
print!("{}: ", title);
let _ = io::stdout().flush();
let mut buf = String::new();
let stdin = io::stdin();
stdin.read_line(&mut buf)?;
Ok(buf)
}