summaryrefslogtreecommitdiff
path: root/src/cmd.rs
blob: c1606e0bb0c476b7b85d7891e7fb78589ef938c3 (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::config::Configuration;
use crate::error::JournalError;
use crate::journal::Journal;
use std::path::PathBuf;
use structopt::StructOpt;

#[derive(Debug, StructOpt)]
pub struct Config {}

impl Config {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        config.dump();
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
pub struct Init {
    #[structopt(help = "Short name for journal")]
    journalname: String,

    #[structopt(help = "Short description of journal, its title")]
    description: String,
}

impl Init {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        Journal::init(&config.dirname, &config.entries)?;
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
pub struct IsJournal {}

impl IsJournal {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        if !Journal::is_journal(&config.dirname, &config.entries) {
            return Err(JournalError::NotAJournal(config.dirname.display().to_string()).into());
        }
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
pub struct New {
    #[structopt(help = "Title of new draft")]
    title: String,

    #[structopt(long, help = "Add link to a topic page")]
    topic: Option<PathBuf>,
}

impl New {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        let journal = Journal::new(&config.dirname, &config.entries)?;
        journal.new_draft(&self.title, &self.topic, &config.editor)?;
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
pub struct NewTopic {
    #[structopt(help = "Path to topic page in journal")]
    path: PathBuf,

    #[structopt(help = "Title of topic page")]
    title: String,
}

impl NewTopic {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        let journal = Journal::new(&config.dirname, &config.entries)?;
        journal.new_topic(&self.path, &self.title, &config.editor)?;
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
pub struct Edit {
    /// Draft id.
    draft: String,
}

impl Edit {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        let journal = Journal::new(&config.dirname, &config.entries)?;
        let filename = journal.pick_draft(&self.draft)?;
        journal.edit_draft(&config.editor, &filename)?;
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
pub struct Finish {
    /// Draft id.
    draft: String,

    /// Set base name of published file.
    basename: String,
}

impl Finish {
    pub fn run(&self, config: &Configuration) -> Result<(), JournalError> {
        let journal = Journal::new(&config.dirname, &config.entries)?;
        let filename = journal.pick_draft(&self.draft)?;
        journal.finish_draft(&filename, &self.basename)?;
        Ok(())
    }
}