diaryrs/src/main.rs

84 lines
2.6 KiB
Rust
Raw Normal View History

2024-12-25 09:38:38 +00:00
mod args;
use args::{Args, Config};
2024-12-25 14:53:17 +00:00
use chrono::Datelike;
2024-12-25 09:38:38 +00:00
use clap::Parser;
2024-12-25 14:53:17 +00:00
use diaryrs::{macros::UnwrapOrFatalAble, time::Time, util};
2024-12-25 09:38:38 +00:00
use indoc::formatdoc;
use std::fs;
use std::io::prelude::*;
fn main() {
let args = Args::parse();
match args.cmd {
args::Commands::Info => {
let time = Time::build().unwrap_or_fatal("Failed to determine time information");
let config = Config::read().unwrap_or_fatal("Failed to read config file");
println!(
"[TIME] Timestamp: {}, Timezone: {}",
time.timestamp, time.timezone
);
2024-12-25 15:05:44 +00:00
println!("[CONFIG] Found at path: {}", config.config_path.display());
println!("[CONFIG] Configuration: {:?}", config)
2024-12-25 09:38:38 +00:00
}
args::Commands::Today => {
let time = Time::build().unwrap_or_fatal("Failed to determine time information");
let config = Config::read().unwrap_or_fatal("Failed to read config file");
let entry = fmt_entry(&time);
// Create folder for day (YYYY-MM-DD)
let year = time.datetime.format("%Y").to_string();
let month = time.datetime.format("%m").to_string();
let month_name = time.datetime.format("%B").to_string();
let day = time.datetime.format("%d").to_string();
2024-12-25 14:53:17 +00:00
let day_ordinal = util::ordinal(time.datetime.day());
2024-12-25 09:38:38 +00:00
let ymd = format!("{}-{}-{}", year, month, day);
let dir_path = config
.base_path
.join(&year)
.join(&month_name)
2024-12-25 14:53:17 +00:00
.join(&day_ordinal);
fs::create_dir_all(&dir_path)
2024-12-25 09:38:38 +00:00
.unwrap_or_fatal("Failed to create directory for today's entry");
// Write entry to file if not exists
let file_path = dir_path.join(format!("{ymd}.md"));
let mut file_handle = fs::OpenOptions::new()
.write(true)
.create_new(true)
.open(file_path)
.unwrap_or_fatal("Error opening today's entry for writing!");
match file_handle.write(entry.as_bytes()) {
Ok(_) => println!("Successfully wrote diary entry for {ymd}. Happy journaling!"),
Err(e) => eprintln!("Error: Failed to write diary entry: {e}"),
};
}
}
}
fn fmt_entry(time: &Time) -> String {
let yaml = formatdoc!(
r#"
---
timestamp: "{}"
timezone: "{}"
---"#,
time.timestamp,
time.timezone
);
formatdoc!(
"
{}
# Dreams
# Entry
Dear Diary,
",
yaml
)
}