1use anyhow::Result;
2use comfy_table::presets::NOTHING;
3use comfy_table::{Cell, Table};
4use std::path::Path;
5
6use crate::color::{cell_bold, stdout_use_color};
7use crate::db;
8use crate::model::Task;
9
10pub fn run(root: &Path, query: &str, json: bool) -> Result<()> {
11 let store = db::open(root)?;
12 let q = query.to_lowercase();
13
14 let tasks: Vec<Task> = store
15 .list_tasks()?
16 .into_iter()
17 .filter(|t| {
18 t.title.to_lowercase().contains(&q) || t.description.to_lowercase().contains(&q)
19 })
20 .collect();
21
22 if json {
23 println!("{}", serde_json::to_string(&tasks)?);
24 } else {
25 let use_color = stdout_use_color();
26 let mut table = Table::new();
27 table.load_preset(NOTHING);
28 for t in &tasks {
29 table.add_row(vec![cell_bold(&t.id, use_color), Cell::new(&t.title)]);
30 }
31 if !tasks.is_empty() {
32 println!("{table}");
33 }
34 }
35
36 Ok(())
37}