ldp_protocol/types/
capability.rs1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum ClaimType {
13 #[default]
15 SelfClaimed,
16 IssuerAttested,
18 RuntimeObserved,
20 ExternallyBenchmarked,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct LdpCapability {
27 pub name: String,
29
30 pub description: Option<String>,
32
33 pub input_schema: Option<Value>,
35
36 pub output_schema: Option<Value>,
38
39 pub quality: Option<QualityMetrics>,
41
42 #[serde(default)]
44 pub domains: Vec<String>,
45}
46
47#[derive(Debug, Clone, Default, Serialize, Deserialize)]
52pub struct QualityMetrics {
53 pub quality_score: Option<f64>,
55
56 pub latency_p50_ms: Option<u64>,
58
59 pub latency_p99_ms: Option<u64>,
61
62 pub cost_per_call_usd: Option<f64>,
64
65 pub max_tokens: Option<u64>,
67
68 pub supports_streaming: bool,
70
71 #[serde(default)]
73 pub claim_type: ClaimType,
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn default_claim_type_is_self_claimed() {
82 let metrics = QualityMetrics::default();
83 assert_eq!(metrics.claim_type, ClaimType::SelfClaimed);
84 }
85
86 #[test]
87 fn claim_type_serialization() {
88 let metrics = QualityMetrics {
89 claim_type: ClaimType::IssuerAttested,
90 quality_score: Some(0.95),
91 ..Default::default()
92 };
93 let json = serde_json::to_value(&metrics).unwrap();
94 assert_eq!(json["claim_type"], "issuer_attested");
95 let restored: QualityMetrics = serde_json::from_value(json).unwrap();
96 assert_eq!(restored.claim_type, ClaimType::IssuerAttested);
97 }
98
99 #[test]
100 fn all_claim_types_exist() {
101 let _ = ClaimType::SelfClaimed;
102 let _ = ClaimType::IssuerAttested;
103 let _ = ClaimType::RuntimeObserved;
104 let _ = ClaimType::ExternallyBenchmarked;
105 }
106}