use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ClaimType {
#[default]
SelfClaimed,
IssuerAttested,
RuntimeObserved,
ExternallyBenchmarked,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LdpCapability {
pub name: String,
pub description: Option<String>,
pub input_schema: Option<Value>,
pub output_schema: Option<Value>,
pub quality: Option<QualityMetrics>,
#[serde(default)]
pub domains: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct QualityMetrics {
pub quality_score: Option<f64>,
pub latency_p50_ms: Option<u64>,
pub latency_p99_ms: Option<u64>,
pub cost_per_call_usd: Option<f64>,
pub max_tokens: Option<u64>,
pub supports_streaming: bool,
#[serde(default)]
pub claim_type: ClaimType,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_claim_type_is_self_claimed() {
let metrics = QualityMetrics::default();
assert_eq!(metrics.claim_type, ClaimType::SelfClaimed);
}
#[test]
fn claim_type_serialization() {
let metrics = QualityMetrics {
claim_type: ClaimType::IssuerAttested,
quality_score: Some(0.95),
..Default::default()
};
let json = serde_json::to_value(&metrics).unwrap();
assert_eq!(json["claim_type"], "issuer_attested");
let restored: QualityMetrics = serde_json::from_value(json).unwrap();
assert_eq!(restored.claim_type, ClaimType::IssuerAttested);
}
#[test]
fn all_claim_types_exist() {
let _ = ClaimType::SelfClaimed;
let _ = ClaimType::IssuerAttested;
let _ = ClaimType::RuntimeObserved;
let _ = ClaimType::ExternallyBenchmarked;
}
}