ldp_protocol/types/
capability.rs1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum ClaimType {
13 SelfClaimed,
15 IssuerAttested,
17 RuntimeObserved,
19 ExternallyBenchmarked,
21}
22
23impl Default for ClaimType {
24 fn default() -> Self {
25 ClaimType::SelfClaimed
26 }
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct LdpCapability {
32 pub name: String,
34
35 pub description: Option<String>,
37
38 pub input_schema: Option<Value>,
40
41 pub output_schema: Option<Value>,
43
44 pub quality: Option<QualityMetrics>,
46
47 #[serde(default)]
49 pub domains: Vec<String>,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct QualityMetrics {
58 pub quality_score: Option<f64>,
60
61 pub latency_p50_ms: Option<u64>,
63
64 pub latency_p99_ms: Option<u64>,
66
67 pub cost_per_call_usd: Option<f64>,
69
70 pub max_tokens: Option<u64>,
72
73 pub supports_streaming: bool,
75
76 #[serde(default)]
78 pub claim_type: ClaimType,
79}
80
81impl Default for QualityMetrics {
82 fn default() -> Self {
83 Self {
84 quality_score: None,
85 latency_p50_ms: None,
86 latency_p99_ms: None,
87 cost_per_call_usd: None,
88 max_tokens: None,
89 supports_streaming: false,
90 claim_type: ClaimType::default(),
91 }
92 }
93}
94
95#[cfg(test)]
96mod tests {
97 use super::*;
98
99 #[test]
100 fn default_claim_type_is_self_claimed() {
101 let metrics = QualityMetrics::default();
102 assert_eq!(metrics.claim_type, ClaimType::SelfClaimed);
103 }
104
105 #[test]
106 fn claim_type_serialization() {
107 let metrics = QualityMetrics {
108 claim_type: ClaimType::IssuerAttested,
109 quality_score: Some(0.95),
110 ..Default::default()
111 };
112 let json = serde_json::to_value(&metrics).unwrap();
113 assert_eq!(json["claim_type"], "issuer_attested");
114 let restored: QualityMetrics = serde_json::from_value(json).unwrap();
115 assert_eq!(restored.claim_type, ClaimType::IssuerAttested);
116 }
117
118 #[test]
119 fn all_claim_types_exist() {
120 let _ = ClaimType::SelfClaimed;
121 let _ = ClaimType::IssuerAttested;
122 let _ = ClaimType::RuntimeObserved;
123 let _ = ClaimType::ExternallyBenchmarked;
124 }
125}