Skip to main content

intent_engine/cli_handlers/
log_command.rs

1use crate::backend::{EventBackend, WorkspaceBackend};
2use crate::cli::LogEventType;
3use crate::error::{IntentError, Result};
4
5/// Handle `ie log` command.
6pub async fn handle_log(
7    event_mgr: &impl EventBackend,
8    ws_mgr: &impl WorkspaceBackend,
9    event_type: LogEventType,
10    message: &str,
11    task: Option<i64>,
12    format: &str,
13) -> Result<()> {
14    // Determine task_id: use --task flag, or fall back to current focused task
15    let target_task_id = if let Some(tid) = task {
16        tid
17    } else {
18        let current_response = ws_mgr.get_current_task(None).await?;
19        let current_task = current_response.task.ok_or_else(|| {
20            IntentError::ActionNotAllowed(
21                "No current task set. Use --task <ID> or start a task first.".to_string(),
22            )
23        })?;
24        current_task.id
25    };
26
27    let event_type_str = event_type.as_str();
28
29    let event = event_mgr
30        .add_event(
31            target_task_id,
32            event_type_str.to_string(),
33            message.to_string(),
34        )
35        .await?;
36
37    if format == "json" {
38        println!("{}", serde_json::to_string_pretty(&event)?);
39    } else {
40        println!("  Event recorded");
41        println!("  ID: {}", event.id);
42        println!("  Type: {}", event_type_str);
43        println!("  Task: #{}", target_task_id);
44        println!(
45            "  Time: {}",
46            event.timestamp.format("%Y-%m-%d %H:%M:%S UTC")
47        );
48        println!("  Message: {}", message);
49    }
50
51    Ok(())
52}