agent-sessions 0.3.0

Read native coding-agent sessions as typed Rust events with source provenance
Documentation
use crate::{Agent, LineErrorKind};
use serde_json::Value;

pub(crate) fn validate(agent: Agent, v: &Value) -> Result<(), LineErrorKind> {
    let fields: &[&str] = match agent {
        Agent::ClaudeCode | Agent::CodeBuddy | Agent::IFlow => &[
            "/message/id",
            "/message/model",
            "/message/stop_reason",
            "/message/usage/inference_geo",
        ],
        Agent::Codex => &[
            "/payload/id",
            "/payload/cwd",
            "/payload/model",
            "/payload/thread_source",
            "/payload/info/model",
            "/payload/info/model_name",
            "/payload/info/metadata/model",
        ],
        _ => &[],
    };
    for path in fields {
        if v.pointer(path)
            .is_some_and(|v| !v.is_null() && !v.is_string())
        {
            return Err(LineErrorKind::InvalidField((*path).into()));
        }
    }
    let objects: &[&str] = match agent {
        Agent::ClaudeCode | Agent::CodeBuddy | Agent::IFlow => &["/message"],
        Agent::Codex => &["/payload/info/metadata"],
        _ => &[],
    };
    for path in objects {
        if v.pointer(path)
            .is_some_and(|v| !v.is_null() && !v.is_object())
        {
            return Err(LineErrorKind::InvalidField((*path).into()));
        }
    }
    Ok(())
}