use anyhow::Result; use std::fs; use std::path::{Path, PathBuf}; use structopt::StructOpt; use thiserror::Error; #[derive(Debug, StructOpt)] #[structopt(about = "maintain a journal")] enum JT { Init { #[structopt(help = "Directory where journal should be stored")] dirname: PathBuf, #[structopt(help = "Short name for journal")] journalname: String, #[structopt(help = "Short description of journal, its title")] description: String, }, IsJournal { #[structopt(help = "Directory that may or may not be a journal")] dirname: PathBuf, }, } #[derive(Debug, Error)] enum JournalError { #[error("directory {0} is not a journal")] NotAJournal(String), } fn main() -> Result<()> { let opt = JT::from_args(); match opt { JT::Init { dirname, journalname, description, } => init(&dirname, &journalname, &description)?, JT::IsJournal { dirname } => is_journal(&dirname)?, } Ok(()) } fn init(dirname: &Path, _journalname: &str, _description: &str) -> anyhow::Result<()> { std::fs::create_dir(dirname)?; Ok(()) } fn is_journal(dirname: &Path) -> anyhow::Result<()> { let meta = fs::symlink_metadata(dirname)?; if !meta.is_dir() { return Err(JournalError::NotAJournal(dirname.display().to_string()).into()); } Ok(()) }