diff --git a/src/metamgr.rs b/src/metamgr.rs index d39b0b7..9191c9d 100644 --- a/src/metamgr.rs +++ b/src/metamgr.rs @@ -5,7 +5,10 @@ use protobuf::Message; use protobuf::descriptor::FieldDescriptorProto_Type; pub trait ProtoMsg { - fn get_proto(&self) -> &dyn Message; + fn deserialize(&self, + obj: &serde_json::Map, + id_key: &mut i64, + name_key: &mut String) {} fn init1(&self) {} fn init2(&self) {} fn init3(&self) {} @@ -26,19 +29,22 @@ pub struct MetaMgr { meta_classes: Vec>, } -fn json_to_pb(obj: &serde_json::Map, pb: &dyn protobuf::Message) { +fn json_to_pb(obj: &serde_json::Map, pb: &mut dyn protobuf::Message) { + let mut v = Vec::::new(); let desc = pb.descriptor(); for field in desc.fields() { let field_desc = field.proto(); match obj.get(field.name()) { Some(v) => { - } None => { } } } + let mut slice: &[u8] = v.as_slice(); + let is = &mut ::protobuf::CodedInputStream::new(&mut slice); + pb.merge_from(is); } impl MetaMgr { @@ -69,7 +75,9 @@ impl MetaMgr { }, serde_json::Value::Object(obj) =>{ let msg = Rc::new(meta.dummy.clone()); - json_to_pb(&obj, msg.get_proto()); + let id_key = &mut 0; + let name_key = &mut String::new(); + msg.deserialize(&obj, id_key, name_key); meta.wrap_list.push(msg); }, _ => {