Skip to main content

things3_cloud/commands/
logbook.rs

1use crate::app::Cli;
2use crate::commands::{Command, DetailedArgs};
3use crate::common::parse_day;
4use crate::ui::render_element_to_string;
5use crate::ui::views::logbook::LogbookView;
6use anyhow::Result;
7use clap::Args;
8use iocraft::prelude::*;
9use std::io::Write;
10use std::sync::Arc;
11
12#[derive(Debug, Default, Args)]
13#[command(about = "Show the Logbook")]
14pub struct LogbookArgs {
15    #[command(flatten)]
16    pub detailed: DetailedArgs,
17    #[arg(
18        long = "from",
19        help = "Show items completed on/after this date (YYYY-MM-DD)"
20    )]
21    pub from_date: Option<String>,
22    #[arg(
23        long = "to",
24        help = "Show items completed on/before this date (YYYY-MM-DD)"
25    )]
26    pub to_date: Option<String>,
27}
28
29impl Command for LogbookArgs {
30    fn run_with_ctx(
31        &self,
32        cli: &Cli,
33        out: &mut dyn Write,
34        ctx: &mut dyn crate::cmd_ctx::CmdCtx,
35    ) -> Result<()> {
36        let store = Arc::new(cli.load_store()?);
37        let today = ctx.today();
38
39        let from_day =
40            parse_day(self.from_date.as_deref(), "--from").map_err(anyhow::Error::msg)?;
41        let to_day = parse_day(self.to_date.as_deref(), "--to").map_err(anyhow::Error::msg)?;
42
43        if let (Some(from), Some(to)) = (from_day, to_day)
44            && from > to
45        {
46            eprintln!("--from date must be before or equal to --to date");
47            return Ok(());
48        }
49
50        let tasks = store.logbook(from_day, to_day);
51        let mut ui = element! {
52            ContextProvider(value: Context::owned(store.clone())) {
53                ContextProvider(value: Context::owned(today)) {
54                    LogbookView(
55                        items: &tasks,
56                        detailed: self.detailed.detailed,
57                    )
58                }
59            }
60        };
61        let rendered = render_element_to_string(&mut ui, cli.no_color);
62        writeln!(out, "{}", rendered)?;
63
64        Ok(())
65    }
66}