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