use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::error::WyrdError;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct SpanEvent {
pub timestamp: DateTime<Utc>,
pub name: String,
#[serde(default)]
pub attributes: serde_json::Map<String, serde_json::Value>,
#[serde(default)]
pub dropped_attributes_count: u32,
}
impl SpanEvent {
pub fn validate(&self) -> Result<(), WyrdError> {
if self.name.is_empty() {
return Err(WyrdError::Validation {
message: "span_event.name must be non-empty".to_string(),
details: serde_json::Value::Null,
});
}
if self.name.len() > 256 {
return Err(WyrdError::Validation {
message: format!(
"span_event.name length must be <= 256, got {}",
self.name.len()
),
details: serde_json::Value::Null,
});
}
if self.attributes.len() > 128 {
return Err(WyrdError::Validation {
message: format!(
"span_event.attributes count must be <= 128, got {}",
self.attributes.len()
),
details: serde_json::Value::Null,
});
}
Ok(())
}
}