summaryrefslogtreecommitdiff
path: root/src/bin/jt2.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/jt2.rs')
-rw-r--r--src/bin/jt2.rs76
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(())
+}