Skip to main content

things3_cloud/commands/
today.rs

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