Skip to main content

things3_cloud/commands/
today.rs

1use crate::app::Cli;
2use crate::commands::{Command, DetailedArgs};
3use crate::ui::render_element_to_string;
4use crate::ui::views::today::TodayView;
5use crate::wire::task::TaskStatus;
6use anyhow::Result;
7use clap::Args;
8use iocraft::prelude::*;
9use std::io::Write;
10use std::sync::Arc;
11
12#[derive(Debug, Default, Args)]
13pub struct TodayArgs {
14    #[command(flatten)]
15    pub detailed: DetailedArgs,
16}
17
18impl Command for TodayArgs {
19    fn run_with_ctx(
20        &self,
21        cli: &Cli,
22        out: &mut dyn Write,
23        ctx: &mut dyn crate::cmd_ctx::CmdCtx,
24    ) -> Result<()> {
25        let store = Arc::new(cli.load_store()?);
26        let today = ctx.today();
27
28        let mut today_items: Vec<_> = store
29            .tasks(Some(TaskStatus::Incomplete), Some(false), None)
30            .into_iter()
31            .filter(|t| {
32                !t.is_heading()
33                    && !t.title.trim().is_empty()
34                    && t.entity == "Task6"
35                    && (t.is_today(&today) || t.evening)
36            })
37            .collect();
38
39        today_items.sort_by_key(|task| {
40            let tir = task.today_index_reference.unwrap_or(0);
41            (
42                std::cmp::Reverse(tir),
43                task.today_index,
44                std::cmp::Reverse(task.index),
45            )
46        });
47
48        let mut ui = element! {
49            ContextProvider(value: Context::owned(store.clone())) {
50                ContextProvider(value: Context::owned(today)) {
51                    TodayView(
52                        items: &today_items,
53                        detailed: self.detailed.detailed,
54                    )
55                }
56            }
57        };
58        let rendered = render_element_to_string(&mut ui, cli.no_color);
59        writeln!(out, "{}", rendered)?;
60
61        Ok(())
62    }
63}