use prost_types::value::Kind;
use serde_json::Value;
pub fn encode<M: prost::Message>(message: &M) -> Result<Vec<u8>, prost::EncodeError> {
let mut buf = Vec::with_capacity(message.encoded_len());
message.encode(&mut buf)?;
Ok(buf)
}
pub fn mapping_from_kind(kind: Kind) -> Option<serde_json::Map<String, serde_json::Value>> {
match value_from_kind(kind) {
Value::Object(mapping) => Some(mapping),
_ => None,
}
}
pub fn value_from_kind(kind: Kind) -> Value {
match kind {
Kind::NullValue(_) => Value::Null,
Kind::BoolValue(v) => Value::Bool(v),
Kind::NumberValue(v) => Value::Number(serde_json::Number::from(v as i64)), Kind::StringValue(v) => Value::String(v),
Kind::ListValue(v) => Value::Array(
v.values
.into_iter()
.filter_map(|v| v.kind)
.map(value_from_kind)
.collect(),
),
Kind::StructValue(v) => Value::Object(
v.fields
.into_iter()
.filter_map(|(k, v)| v.kind.map(value_from_kind).map(|v| (k, v)))
.collect(),
),
}
}
pub fn value_from_struct(value: prost_types::Struct) -> prost_types::Value {
prost_types::Value {
kind: Some(prost_types::value::Kind::StructValue(value)),
}
}
pub fn from_json(value: Value) -> prost_types::Value {
prost_types::Value {
kind: Some(match value {
Value::Null => Kind::NullValue(<_>::default()),
Value::Bool(v) => Kind::BoolValue(v),
Value::Number(v) => Kind::NumberValue(v.as_f64().unwrap()),
Value::String(v) => Kind::StringValue(v),
Value::Array(v) => Kind::ListValue(prost_types::ListValue {
values: v.into_iter().map(from_json).collect(),
}),
Value::Object(v) => Kind::StructValue(prost_types::Struct {
fields: v
.into_iter()
.map(|(key, value)| (key, from_json(value)))
.collect(),
}),
}),
}
}