search.rs

 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}