use std::collections::HashMap; use segment::json_path::JsonPath; use tonic::Status; use crate::grpc::qdrant::value::Kind; use crate::grpc::qdrant::{ListValue, Struct, Value}; pub fn payload_to_proto(payload: segment::types::Payload) -> HashMap { payload .into_iter() .map(|(k, v)| (k, json_to_proto(v))) .collect() } pub fn dict_to_proto(dict: HashMap) -> HashMap { dict.into_iter() .map(|(k, v)| (k, json_to_proto(v))) .collect() } pub fn json_to_proto(json_value: serde_json::Value) -> Value { match json_value { serde_json::Value::Null => Value { kind: Some(Kind::NullValue(0)), }, serde_json::Value::Bool(v) => Value { kind: Some(Kind::BoolValue(v)), }, serde_json::Value::Number(n) => Value { kind: if let Some(int) = n.as_i64() { Some(Kind::IntegerValue(int)) } else { Some(Kind::DoubleValue(n.as_f64().unwrap())) }, }, serde_json::Value::String(s) => Value { kind: Some(Kind::StringValue(s)), }, serde_json::Value::Array(v) => { let list = v.into_iter().map(json_to_proto).collect(); Value { kind: Some(Kind::ListValue(ListValue { values: list })), } } serde_json::Value::Object(m) => { let map = m.into_iter().map(|(k, v)| (k, json_to_proto(v))).collect(); Value { kind: Some(Kind::StructValue(Struct { fields: map })), } } } } pub fn json_path_from_proto(a: &str) -> Result { JsonPath::try_from(a) .map_err(|_| Status::invalid_argument(format!("Invalid json path: \'{a}\'"))) } pub fn proto_to_payloads(proto: HashMap) -> Result { let mut map: serde_json::Map = serde_json::Map::new(); for (k, v) in proto { map.insert(k, proto_to_json(v)?); } Ok(map.into()) } pub fn proto_dict_to_json( proto: HashMap, ) -> Result, Status> { let mut map = HashMap::new(); for (k, v) in proto { map.insert(k, proto_to_json(v)?); } Ok(map) } pub fn proto_to_json(proto: Value) -> Result { match proto.kind { None => Ok(serde_json::Value::default()), Some(kind) => match kind { Kind::NullValue(_) => Ok(serde_json::Value::Null), Kind::DoubleValue(n) => { let Some(v) = serde_json::Number::from_f64(n) else { return Err(Status::invalid_argument("cannot convert to json number")); }; Ok(serde_json::Value::Number(v)) } Kind::IntegerValue(i) => Ok(serde_json::Value::Number(i.into())), Kind::StringValue(s) => Ok(serde_json::Value::String(s)), Kind::BoolValue(b) => Ok(serde_json::Value::Bool(b)), Kind::StructValue(s) => { let mut map = serde_json::Map::new(); for (k, v) in s.fields { map.insert(k, proto_to_json(v)?); } Ok(serde_json::Value::Object(map)) } Kind::ListValue(l) => { let mut list = Vec::new(); for v in l.values { list.push(proto_to_json(v)?); } Ok(serde_json::Value::Array(list)) } }, } }