diff --git a/src/cli.rs b/src/cli.rs
index 0da37a3..db3c14e 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -8,7 +8,7 @@ use directories::ProjectDirs;
use structopt::StructOpt;
use crate::eval::{self, DateRange, Entry, EntryMode};
-use crate::files::arguments::{CliDate, CliIdent, CliRange};
+use crate::files::cli::{CliDate, CliIdent, CliRange};
use crate::files::{self, Files, ParseError};
use self::error::{Error, Result};
diff --git a/src/eval.rs b/src/eval.rs
index bd02859..24859af 100644
--- a/src/eval.rs
+++ b/src/eval.rs
@@ -1,6 +1,6 @@
use chrono::NaiveDate;
-use crate::files::arguments::{CliDate, CliDatum, CliRange};
+use crate::files::cli::{CliDate, CliDatum, CliRange};
use crate::files::{FileSource, Files};
use self::command::{CommandState, EvalCommand};
diff --git a/src/files.rs b/src/files.rs
index 8d66b2c..aba9c48 100644
--- a/src/files.rs
+++ b/src/files.rs
@@ -11,7 +11,7 @@ use self::commands::{Command, Done, File, Log};
pub use self::error::{Error, ParseError, Result};
use self::primitives::Spanned;
-pub mod arguments;
+pub mod cli;
pub mod commands;
mod error;
mod format;
diff --git a/src/files/arguments.rs b/src/files/cli.rs
similarity index 76%
rename from src/files/arguments.rs
rename to src/files/cli.rs
index 100e7f1..6f72ca9 100644
--- a/src/files/arguments.rs
+++ b/src/files/cli.rs
@@ -5,10 +5,21 @@ use chrono::NaiveDate;
use pest::iterators::Pair;
use pest::Parser;
-use super::commands::Delta;
+use super::commands::{Command, Delta};
use super::parse::{self, Result, Rule, TodayfileParser};
use super::ParseError;
+fn from_str_via_parse
(s: &str, rule: Rule, parse: P) -> result::Result>
+where
+ P: FnOnce(Pair<'_, Rule>) -> Result,
+{
+ let mut pairs = TodayfileParser::parse(rule, s).map_err(|e| ParseError::new((), e))?;
+ let p = pairs.next().unwrap();
+ assert_eq!(pairs.next(), None);
+
+ parse(p).map_err(|e| ParseError::new((), e))
+}
+
#[derive(Debug)]
pub enum CliDatum {
Date(NaiveDate),
@@ -50,12 +61,7 @@ impl FromStr for CliDate {
type Err = ParseError<()>;
fn from_str(s: &str) -> result::Result> {
- let mut pairs =
- TodayfileParser::parse(Rule::cli_date, s).map_err(|e| ParseError::new((), e))?;
- let p = pairs.next().unwrap();
- assert_eq!(pairs.next(), None);
-
- parse_cli_date(p).map_err(|e| ParseError::new((), e))
+ from_str_via_parse(s, Rule::cli_date, parse_cli_date)
}
}
@@ -79,12 +85,7 @@ impl FromStr for CliIdent {
type Err = ParseError<()>;
fn from_str(s: &str) -> result::Result> {
- let mut pairs =
- TodayfileParser::parse(Rule::cli_ident, s).map_err(|e| ParseError::new((), e))?;
- let p = pairs.next().unwrap();
- assert_eq!(pairs.next(), None);
-
- parse_cli_ident(p).map_err(|e| ParseError::new((), e))
+ from_str_via_parse(s, Rule::cli_ident, parse_cli_ident)
}
}
@@ -151,11 +152,23 @@ impl FromStr for CliRange {
type Err = ParseError<()>;
fn from_str(s: &str) -> result::Result> {
- let mut pairs =
- TodayfileParser::parse(Rule::cli_range, s).map_err(|e| ParseError::new((), e))?;
- let p = pairs.next().unwrap();
- assert_eq!(pairs.next(), None);
-
- parse_cli_range(p).map_err(|e| ParseError::new((), e))
+ from_str_via_parse(s, Rule::cli_range, parse_cli_range)
+ }
+}
+
+#[derive(Debug)]
+pub struct CliCommand(pub Command);
+
+fn parse_cli_command(p: Pair<'_, Rule>) -> Result {
+ assert_eq!(p.as_rule(), Rule::cli_command);
+ let p = p.into_inner().next().unwrap();
+ Ok(CliCommand(parse::parse_command(p)?.value))
+}
+
+impl FromStr for CliCommand {
+ type Err = ParseError<()>;
+
+ fn from_str(s: &str) -> result::Result> {
+ from_str_via_parse(s, Rule::cli_command, parse_cli_command)
}
}
diff --git a/src/files/grammar.pest b/src/files/grammar.pest
index b83741e..3d80b4c 100644
--- a/src/files/grammar.pest
+++ b/src/files/grammar.pest
@@ -156,3 +156,4 @@ cli_ident = { SOI ~ (cli_date | number) ~ EOI }
cli_range_start = { cli_datum ~ delta? }
cli_range_end = { cli_datum ~ delta? | delta }
cli_range = { SOI ~ cli_range_start ~ ("--" ~ cli_range_end)? ~ EOI }
+cli_command = { SOI ~ command ~ EOI }
diff --git a/src/files/parse.rs b/src/files/parse.rs
index 65200d4..574d785 100644
--- a/src/files/parse.rs
+++ b/src/files/parse.rs
@@ -818,7 +818,7 @@ fn parse_log(p: Pair<'_, Rule>) -> Result {
Ok(Log { date, desc })
}
-fn parse_command(p: Pair<'_, Rule>) -> Result> {
+pub fn parse_command(p: Pair<'_, Rule>) -> Result> {
assert_eq!(p.as_rule(), Rule::command);
let p = p.into_inner().next().unwrap();