Skip to main content

awp_types/
discovery.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{AwpVersion, TrustLevel};
4
5/// AWP discovery document served at `/.well-known/awp.json`.
6///
7/// Describes a site's AWP capabilities, version, and endpoint URLs.
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct AwpDiscoveryDocument {
11    pub version: AwpVersion,
12    pub site_name: String,
13    pub site_description: String,
14    pub capability_manifest_url: String,
15    pub a2a_endpoint_url: String,
16    pub events_endpoint_url: String,
17    pub health_endpoint_url: String,
18    pub supported_trust_levels: Vec<TrustLevel>,
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24    use crate::CURRENT_VERSION;
25
26    #[test]
27    fn test_serde_round_trip() {
28        let doc = AwpDiscoveryDocument {
29            version: CURRENT_VERSION,
30            site_name: "Test Site".to_string(),
31            site_description: "A test site".to_string(),
32            capability_manifest_url: "https://example.com/awp/manifest".to_string(),
33            a2a_endpoint_url: "https://example.com/awp/a2a".to_string(),
34            events_endpoint_url: "https://example.com/awp/events/subscribe".to_string(),
35            health_endpoint_url: "https://example.com/awp/health".to_string(),
36            supported_trust_levels: vec![
37                TrustLevel::Anonymous,
38                TrustLevel::Known,
39                TrustLevel::Partner,
40                TrustLevel::Internal,
41            ],
42        };
43        let json = serde_json::to_string(&doc).unwrap();
44        let deserialized: AwpDiscoveryDocument = serde_json::from_str(&json).unwrap();
45        assert_eq!(doc, deserialized);
46    }
47}