use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct ModelLoadedEvent {
pub edge_id: String,
pub model_id: String,
pub model_name: String,
pub load_duration_ms: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub onde_app_id: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct InferenceEvent {
pub edge_id: String,
pub model_id: String,
pub request_id: String,
pub duration_ms: u64,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub onde_app_id: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn model_loaded_serializes_onde_app_id_when_present() {
let event = ModelLoadedEvent {
edge_id: "edge-1".into(),
model_id: "org/repo".into(),
model_name: "Repo 3B".into(),
load_duration_ms: 1234,
onde_app_id: Some("app-uuid".into()),
};
let value = serde_json::to_value(&event).expect("serialize");
assert_eq!(value["onde_app_id"], "app-uuid");
assert_eq!(value["load_duration_ms"], 1234);
}
#[test]
fn onde_app_id_is_omitted_when_absent() {
let event = InferenceEvent {
edge_id: "edge-1".into(),
model_id: "org/repo".into(),
request_id: "onde-1-0".into(),
duration_ms: 42,
status: "success".into(),
onde_app_id: None,
};
let value = serde_json::to_value(&event).expect("serialize");
assert!(value.get("onde_app_id").is_none());
}
}