anystruct/
into_proto.rs

1use crate::{JsonStruct, ProtoStruct};
2
3pub trait IntoProto {
4    fn into_proto(self) -> prost_types::Value;
5}
6
7impl IntoProto for serde_json::Value {
8    fn into_proto(self) -> prost_types::Value {
9        match self {
10            serde_json::Value::Null => prost_types::Value { kind: None },
11            serde_json::Value::Bool(b) => prost_types::Value {
12                kind: Some(prost_types::value::Kind::BoolValue(b)),
13            },
14            serde_json::Value::Number(n) => prost_types::Value {
15                kind: Some(prost_types::value::Kind::NumberValue(
16                    n.as_f64().unwrap_or_default(),
17                )),
18            },
19            serde_json::Value::String(s) => prost_types::Value {
20                kind: Some(prost_types::value::Kind::StringValue(s)),
21            },
22            serde_json::Value::Array(a) => prost_types::Value {
23                kind: Some(prost_types::value::Kind::ListValue(
24                    prost_types::ListValue {
25                        values: a.into_iter().map(|v| v.into_proto()).collect(),
26                    },
27                )),
28            },
29            serde_json::Value::Object(o) => prost_types::Value {
30                kind: Some(prost_types::value::Kind::StructValue(prost_types::Struct {
31                    fields: o.into_iter().map(|(k, v)| (k, v.into_proto())).collect(),
32                })),
33            },
34        }
35    }
36}
37
38pub trait IntoProtoStruct {
39    fn into_proto_struct(self) -> prost_types::Struct;
40}
41
42impl IntoProtoStruct for JsonStruct {
43    fn into_proto_struct(self) -> ProtoStruct {
44        let fields = self
45            .into_iter()
46            .map(|(name, value)| {
47                let proto_value = value.into_proto();
48                (name, proto_value)
49            })
50            .collect();
51
52        ProtoStruct { fields }
53    }
54}