Skip to main content

openapi_nexus_spec/oas31/spec/
server.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::spec_extensions;
6
7/// An object representing a Server.
8#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9pub struct Server {
10    pub url: String,
11
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub description: Option<String>,
14
15    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
16    pub variables: BTreeMap<String, ServerVariable>,
17
18    #[serde(flatten, with = "spec_extensions")]
19    pub extensions: BTreeMap<String, serde_json::Value>,
20}
21
22/// An object representing a Server Variable for server URL template substitution.
23#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
24pub struct ServerVariable {
25    pub default: String,
26
27    #[serde(rename = "enum", default, skip_serializing_if = "Vec::is_empty")]
28    pub substitutions_enum: Vec<String>,
29
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub description: Option<String>,
32
33    #[serde(flatten, with = "spec_extensions")]
34    pub extensions: BTreeMap<String, serde_json::Value>,
35}
36
37#[cfg(test)]
38mod tests {
39    use serde_json::json;
40
41    use super::{Server, ServerVariable};
42
43    #[test]
44    fn server_extensions_round_trip() {
45        let payload = r#"{
46            "url": "https://example.com",
47            "x-test": "alpha"
48        }"#;
49
50        let server: Server = serde_json::from_str(payload).expect("server parses");
51        assert_eq!(server.extensions.get("test"), Some(&json!("alpha")));
52
53        let value = serde_json::to_value(server).expect("server serializes");
54        assert_eq!(value.get("x-test"), Some(&json!("alpha")));
55    }
56
57    #[test]
58    fn server_variable_extensions_round_trip() {
59        let payload = r#"{
60            "default": "example",
61            "x-meta": {"enabled": true}
62        }"#;
63
64        let variable: ServerVariable = serde_json::from_str(payload).expect("variable parses");
65        assert_eq!(
66            variable.extensions.get("meta"),
67            Some(&json!({"enabled": true}))
68        );
69
70        let value = serde_json::to_value(variable).expect("variable serializes");
71        assert_eq!(value.get("x-meta"), Some(&json!({"enabled": true})));
72    }
73}