1use anyhow::Result;
2use loro::LoroMap;
3use std::path::Path;
4
5use crate::db;
6
7pub fn run(root: &Path, id: &str, message: &str, json: bool) -> Result<()> {
8 let store = db::open(root)?;
9 let task_id = db::resolve_task_id(&store, id, false)?;
10 let log_id = db::gen_id();
11 let ts = db::now_utc();
12
13 store.apply_and_persist(|doc| {
14 let tasks = doc.get_map("tasks");
15 let task =
16 db::get_task_map(&tasks, &task_id)?.ok_or_else(|| anyhow::anyhow!("task not found"))?;
17 let logs = db::get_or_create_child_map(&task, "logs")?;
18 let entry = logs.insert_container(log_id.as_str(), LoroMap::new())?;
19 entry.insert("timestamp", ts.clone())?;
20 entry.insert("message", message)?;
21 task.insert("updated_at", ts.clone())?;
22 Ok(())
23 })?;
24
25 let entry = db::LogEntry {
26 id: log_id,
27 timestamp: ts,
28 message: message.to_string(),
29 };
30
31 if json {
32 println!("{}", serde_json::to_string(&entry)?);
33 } else {
34 println!("logged to {}", task_id);
35 }
36
37 Ok(())
38}