openapi_nexus_spec/oas31/spec/
server.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::spec_extensions;
6
7#[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#[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}