use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ObservabilitySpanKind {
Llm,
Chain,
Tool,
Embedding,
Retriever,
Graph,
}
impl ObservabilitySpanKind {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Llm => "llm",
Self::Chain => "chain",
Self::Tool => "tool",
Self::Embedding => "embedding",
Self::Retriever => "retriever",
Self::Graph => "graph",
}
}
}
impl fmt::Display for ObservabilitySpanKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
#[test]
fn span_kind_display() {
assert_eq!(ObservabilitySpanKind::Llm.to_string(), "llm");
assert_eq!(ObservabilitySpanKind::Chain.to_string(), "chain");
assert_eq!(ObservabilitySpanKind::Tool.to_string(), "tool");
assert_eq!(ObservabilitySpanKind::Embedding.to_string(), "embedding");
assert_eq!(ObservabilitySpanKind::Retriever.to_string(), "retriever");
assert_eq!(ObservabilitySpanKind::Graph.to_string(), "graph");
}
#[test]
fn span_kind_serialization_roundtrip() {
let kind = ObservabilitySpanKind::Llm;
let json = serde_json::to_string(&kind).unwrap();
let deserialized: ObservabilitySpanKind = serde_json::from_str(&json).unwrap();
assert_eq!(kind, deserialized);
}
}