Add command line arguments
This commit is contained in:
parent
11fbaa582e
commit
79c2936766
3 changed files with 240 additions and 3 deletions
55
src/main.rs
55
src/main.rs
|
|
@ -5,11 +5,60 @@ use reporter::{MarkdownReporter, Reporter};
|
|||
|
||||
use things::task::Task;
|
||||
use anyhow::Result;
|
||||
use clap::{Parser, ValueEnum};
|
||||
|
||||
#[derive(ValueEnum, Copy, Clone, Eq, PartialEq)]
|
||||
enum Modes {
|
||||
/// Generate a report containing projected work for the day and a morning message
|
||||
Morning,
|
||||
/// Generate a report that is intended to be used for sharing what major tasks were completed
|
||||
/// in the last cycle.
|
||||
Cycle,
|
||||
/// Generate a report for what was actually done today and a signoff message
|
||||
Signoff,
|
||||
}
|
||||
|
||||
impl Modes {
|
||||
fn format_tasks(&self, task_report: &str) -> String {
|
||||
match self {
|
||||
Modes::Morning => format!("Starting\n\n{}", task_report),
|
||||
Modes::Signoff => format!("Stopping now\n\n{}", task_report),
|
||||
Modes::Cycle => format!("*Cycle Report*\n\n{}", task_report),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Modes {
|
||||
fn default() -> Modes {
|
||||
Modes::Morning
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Parser)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
struct CliArgs {
|
||||
/// A list of tags to filter requests on
|
||||
#[arg(short, long)]
|
||||
tags: Vec<String>,
|
||||
|
||||
/// Control what type of report to generate
|
||||
#[arg(short, long, default_value_t = Modes::default())]
|
||||
#[clap(value_enum)]
|
||||
mode: Modes,
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let today = Task::today()?;
|
||||
let reported: Vec<Task> = today.into_iter().filter(|task| task.has_tag("Report")).collect();
|
||||
println!("{}", MarkdownReporter.report(reported));
|
||||
let args = CliArgs::parse();
|
||||
let tasks = match args.mode {
|
||||
Modes::Morning => Task::today(),
|
||||
Modes::Signoff => Task::logbook(),
|
||||
Modes::Cycle => panic!("Unimplemented"),
|
||||
}?;
|
||||
let reported: Vec<Task> = tasks.into_iter().filter(|task| {
|
||||
args.tags.iter().all(|tag| task.has_tag(tag))
|
||||
}).collect();
|
||||
let report = args.mode.format_tasks(&MarkdownReporter.report(reported));
|
||||
println!("{report}");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue