ccql 0.1.2

Claude Code Query Language - SQL query engine for Claude Code data
Documentation
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HistoryEntry {
    pub display: String,
    pub timestamp: i64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub project: Option<String>,
    #[serde(rename = "sessionId", skip_serializing_if = "Option::is_none")]
    pub session_id: Option<String>,
    #[serde(rename = "pastedContents", default)]
    pub pasted_contents: HashMap<String, serde_json::Value>,
}

impl HistoryEntry {
    pub fn is_user_prompt(&self) -> bool {
        !self.display.is_empty() && !self.display.starts_with('/')
    }

    pub fn is_command(&self) -> bool {
        self.display.starts_with('/')
    }

    pub fn timestamp_datetime(&self) -> chrono::DateTime<chrono::Utc> {
        chrono::DateTime::from_timestamp_millis(self.timestamp)
            .unwrap_or_else(chrono::Utc::now)
    }

    pub fn formatted_time(&self) -> String {
        self.timestamp_datetime()
            .format("%Y-%m-%d %H:%M:%S")
            .to_string()
    }

    pub fn project_name(&self) -> Option<&str> {
        self.project.as_ref().and_then(|p| p.split('/').next_back())
    }
}