summaryrefslogtreecommitdiff
path: root/src/bin/jt2.rs
blob: cf55aef47eaea680636c7ecf7a467260fb7f5c12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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(())
}