1use anyhow::Result;
2use std::path::Path;
3
4use crate::db;
5
6pub fn run(root: &Path, ids: &[String], json: bool) -> Result<()> {
7 let store = db::open(root)?;
8 let ts = db::now_utc();
9
10 let mut closed = Vec::new();
11 for raw in ids {
12 let id = db::resolve_task_id(&store, raw, false)?;
13 let id_key = id.as_str().to_string();
14 store.apply_and_persist(|doc| {
15 let tasks = doc.get_map("tasks");
16 if let Some(task) = db::get_task_map(&tasks, &id)? {
17 task.insert("status", db::status_label(db::Status::Closed))?;
18 task.insert("updated_at", ts.clone())?;
19 }
20 Ok(())
21 })?;
22 closed.push(id_key);
23 }
24
25 if json {
26 let out: Vec<_> = closed
27 .iter()
28 .map(|id| serde_json::json!({"id": id, "status": "closed"}))
29 .collect();
30 println!("{}", serde_json::to_string(&out)?);
31 } else {
32 let c = crate::color::stdout_theme();
33 for id in closed {
34 println!("{}closed{} {id}", c.green, c.reset);
35 }
36 }
37
38 Ok(())
39}