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(())
}
|