modql/filter/json/
ovs_de_value.rs1use crate::filter::json::ovs_json::OpValueToOpValType;
2use crate::filter::{OpValValue, OpValsValue};
3use serde::{Deserialize, Deserializer};
4use serde_json::Value;
5
6impl<'de> Deserialize<'de> for OpValsValue {
7 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
8 where
9 D: Deserializer<'de>,
10 {
11 let v: Value = Deserialize::deserialize(deserializer)?;
12
13 let op_vals_value: OpValsValue = if v.is_number() || v.is_boolean() || v.is_string() {
14 OpValValue::Eq(v).into()
15 } else if v.is_object() {
16 let mut opvals: Vec<OpValValue> = Vec::new();
17 let Value::Object(obj) = v else {
18 return Err(serde::de::Error::custom("OpValValue should be object"));
19 };
20
21 for (key, value) in obj.into_iter() {
22 let op_val = OpValValue::op_value_to_op_val_type(&key, value).map_err(serde::de::Error::custom)?;
23 opvals.push(op_val);
24 }
25 OpValsValue(opvals)
26 } else {
27 return Err(serde::de::Error::custom(
28 "OpValJson value mut be either number, bool, string, or an Object",
29 ));
30 };
31
32 Ok(op_vals_value)
33 }
34}