use std::time::{SystemTime, UNIX_EPOCH};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum InterfaceKind {
Cli,
Web,
Api,
Mcp,
Acp,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RequestContext {
pub interface: InterfaceKind,
pub request_id: String,
pub trace_id: String,
}
impl RequestContext {
pub fn for_interface(interface: InterfaceKind) -> Self {
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |duration| duration.as_nanos());
Self {
interface,
request_id: format!("req-{nanos}"),
trace_id: format!("trace-{nanos}"),
}
}
pub fn with_ids(
interface: InterfaceKind,
request_id: impl Into<String>,
trace_id: impl Into<String>,
) -> Self {
Self {
interface,
request_id: request_id.into(),
trace_id: trace_id.into(),
}
}
}