diff options
Diffstat (limited to 'src/bin/jt2.rs')
-rw-r--r-- | src/bin/jt2.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/bin/jt2.rs b/src/bin/jt2.rs new file mode 100644 index 0000000..cf55aef --- /dev/null +++ b/src/bin/jt2.rs @@ -0,0 +1,76 @@ +use jt2::config::Configuration; +use jt2::error::JournalError; +use jt2::opt::{Opt, SubCommand}; + +use log::debug; +use std::fs; +use std::path::Path; +use std::process::Command; +use structopt::StructOpt; + +fn main() -> anyhow::Result<()> { + pretty_env_logger::init_custom_env("JT_LOG"); + let opt = Opt::from_args(); + let config = Configuration::read(&opt)?; + match opt.cmd { + SubCommand::Config => config.dump(), + SubCommand::Init { + journalname, + description, + } => init(&config.dirname, &journalname, &description)?, + SubCommand::IsJournal => is_journal(&config.dirname)?, + SubCommand::New { title } => new_draft(&title, &config.dirname, &config.editor)?, + SubCommand::Edit => edit_draft(&config.dirname, &config.editor)?, + SubCommand::Finish => finish_draft(&config.dirname)?, + } + Ok(()) +} + +fn init(dirname: &Path, _journalname: &str, _description: &str) -> anyhow::Result<()> { + std::fs::create_dir(dirname) + .map_err(|err| JournalError::CreateDirectory(dirname.to_path_buf(), err))?; + 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(()) +} + +fn new_draft(title: &str, dirname: &Path, _editor: &str) -> anyhow::Result<()> { + let drafts = dirname.join("drafts"); + if !drafts.exists() { + std::fs::create_dir(&drafts)?; + } + let draft_filename = drafts.join("0.md"); + std::fs::write(draft_filename, title)?; + Ok(()) +} + +fn edit_draft(dirname: &Path, editor: &str) -> anyhow::Result<()> { + debug!("edit_draft: dirname={:?}", dirname); + debug!("edit_draft: editor={:?}", editor); + let drafts = dirname.join("drafts"); + let draft_filename = drafts.join("0.md"); + debug!("edit_draft: draft_filename={:?}", draft_filename); + Command::new(editor).arg(draft_filename).status()?; + debug!("edit_draft: editor finished"); + Ok(()) +} + +fn finish_draft(dirname: &Path) -> anyhow::Result<()> { + let drafts = dirname.join("drafts"); + let draft = drafts.join("0.md"); + + let entries = dirname.join("entries"); + if !entries.exists() { + std::fs::create_dir(&entries)?; + } + let entry = entries.join("0.md"); + + std::fs::rename(draft, entry)?; + Ok(()) +} |