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}