Skip to main content

opensearch_client/common/
array_or_json.rs

1/*
2 * opensearch-client
3 *
4 * Rust Client for OpenSearch
5 *
6 * The version of the OpenAPI document: 3.1.0
7 * Contact: alberto.paro@gmail.com
8 * Generated by Paro OpenAPI Generator
9 */
10
11use serde::{Deserialize, Serialize};
12
13#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
14#[serde(untagged)]
15pub enum ArrayOrJson {
16    ArrayValue(Vec<serde_json::Value>),
17    SingleValue(serde_json::Value),
18}
19
20impl std::fmt::Display for ArrayOrJson {
21    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
22        match self {
23            ArrayOrJson::SingleValue(s) => write!(f, "{}", s),
24            ArrayOrJson::ArrayValue(v) => write!(
25                f,
26                "{}",
27                v.iter()
28                    .map(|x| x.to_string())
29                    .collect::<Vec<String>>()
30                    .join(", ")
31            ),
32        }
33    }
34}
35
36impl ArrayOrJson {
37    pub fn as_vec(&self) -> Vec<serde_json::Value> {
38        match self {
39            ArrayOrJson::SingleValue(s) => vec![s.clone()],
40            ArrayOrJson::ArrayValue(v) => v.clone(),
41        }
42    }
43}
44
45impl Default for ArrayOrJson {
46    fn default() -> Self {
47        ArrayOrJson::ArrayValue(Vec::new())
48    }
49}
50
51// Allow constructing ArrayOrJson from serde_json::Value
52impl From<serde_json::Value> for ArrayOrJson {
53    fn from(s: serde_json::Value) -> Self {
54        ArrayOrJson::SingleValue(s)
55    }
56}
57
58// Allow constructing ArrayOrJson from Vec<serde_json::Value>
59impl From<Vec<serde_json::Value>> for ArrayOrJson {
60    fn from(v: Vec<serde_json::Value>) -> Self {
61        ArrayOrJson::ArrayValue(v)
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use super::*;
68    use serde_json::{from_str, json, to_string};
69    #[derive(Debug, Deserialize, Serialize, Default)]
70    struct WaitWrapper {
71        #[serde(default)]
72        wait: ArrayOrJson,
73    }
74
75    #[test]
76    fn test_deserialize_number() {
77        let json = r#"{"wait": {"name":"0"}}"#;
78        let obj: WaitWrapper = from_str(json).unwrap();
79        assert_eq!(obj.wait, ArrayOrJson::SingleValue(json!({"name": "0"})));
80    }
81
82    #[test]
83    fn test_deserialize_string() {
84        let json = r#"{"wait": []}"#;
85        let obj: WaitWrapper = from_str(json).unwrap();
86        assert_eq!(obj.wait, ArrayOrJson::ArrayValue(Vec::new()));
87    }
88
89    #[test]
90    fn test_default_value() {
91        let json = r#"{}"#;
92        let obj: WaitWrapper = from_str(json).unwrap();
93        assert_eq!(obj.wait, ArrayOrJson::default());
94    }
95
96    #[test]
97    fn test_from_conversions() {
98        let a: ArrayOrJson = json!({"name": "0"}).into();
99        let b: ArrayOrJson = vec![json!({"name": "0"})].into();
100        assert_eq!(a, ArrayOrJson::SingleValue(json!({"name": "0"})));
101        assert_eq!(b, ArrayOrJson::ArrayValue(vec![json!({"name": "0"})]));
102    }
103
104    #[test]
105    fn test_serialization() {
106        let a = WaitWrapper {
107            wait: json!({"name": "0"}).into(),
108        };
109        let b = WaitWrapper {
110            wait: vec![json!({"name": "0"})].into(),
111        };
112        assert_eq!(to_string(&a).unwrap(), r#"{"wait":{"name":"0"}}"#);
113        assert_eq!(to_string(&b).unwrap(), r#"{"wait":[{"name":"0"}]}"#);
114    }
115}