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