opensearch_client/common/
array_or_json.rs1use 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
51impl From<serde_json::Value> for ArrayOrJson {
53 fn from(s: serde_json::Value) -> Self {
54 ArrayOrJson::SingleValue(s)
55 }
56}
57
58impl 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}