use serde::{Deserialize, Serialize};
use crate::error::WyrdError;
use crate::vala::ids::{SpanId, TraceId};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct SpanLink {
pub trace_id: TraceId,
pub span_id: SpanId,
#[serde(default)]
pub trace_state: String,
#[serde(default)]
pub flags: u32,
#[serde(default)]
pub attributes: serde_json::Map<String, serde_json::Value>,
#[serde(default)]
pub dropped_attributes_count: u32,
}
impl SpanLink {
pub fn validate(&self) -> Result<(), WyrdError> {
if self.trace_state.len() > 512 {
return Err(WyrdError::Validation {
message: format!(
"span_link.trace_state length must be <= 512, got {}",
self.trace_state.len()
),
details: serde_json::Value::Null,
});
}
if self.attributes.len() > 128 {
return Err(WyrdError::Validation {
message: format!(
"span_link.attributes count must be <= 128, got {}",
self.attributes.len()
),
details: serde_json::Value::Null,
});
}
Ok(())
}
}