modql/filter/json/
ovs_de_value.rs

1use 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}