things3_cloud/commands/
logbook.rs1use 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}