From bd11c1108eb78ada3b27c56b762cc31e3c3ad029 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 1 Jan 2022 23:21:57 +0800 Subject: [PATCH] 1 --- src/metamgr.rs | 65 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/src/metamgr.rs b/src/metamgr.rs index 9191c9d..f2fb2d3 100644 --- a/src/metamgr.rs +++ b/src/metamgr.rs @@ -1,8 +1,6 @@ use std::rc::Rc; use std::fs::File; use std::collections::HashMap; -use protobuf::Message; -use protobuf::descriptor::FieldDescriptorProto_Type; pub trait ProtoMsg { fn deserialize(&self, @@ -25,26 +23,26 @@ struct MetaClass { wrap_name_hash: HashMap> } -pub struct MetaMgr { - meta_classes: Vec>, -} +impl MetaClass { -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 => { - - } + fn deserialize_json(&mut self, obj: &serde_json::Map) { + let msg = Rc::new(self.dummy.clone()); + let id_key = &mut 0; + let name_key = &mut String::new(); + msg.deserialize(&obj, id_key, name_key); + self.wrap_list.push(msg.clone()); + if *id_key != 0 { + self.wrap_id_hash.insert(*id_key, msg.clone()); + } + if !name_key.is_empty() { + self.wrap_name_hash.insert(name_key.to_string(), msg.clone()); } } - let mut slice: &[u8] = v.as_slice(); - let is = &mut ::protobuf::CodedInputStream::new(&mut slice); - pb.merge_from(is); + +} + +pub struct MetaMgr { + meta_classes: Vec>, } impl MetaMgr { @@ -63,22 +61,37 @@ impl MetaMgr { } + pub fn register_meta(&mut self, file_name: String, idx: i32, prim_key: String, sec_key: String, dummy: T) { + let meta = MetaClass:: { + file_name: file_name, + idx: 100, + prim_key: prim_key, + sec_key: sec_key, + dummy: dummy, + wrap_list: Vec::new(), + wrap_id_hash: HashMap::new(), + wrap_name_hash: HashMap::new() + }; + self.meta_classes.push(meta); + } + pub fn load(&mut self) { - for meta in &mut self.meta_classes { + for i in 0..self.meta_classes.len() { + let meta = &mut self.meta_classes[i]; match File::open(&meta.file_name) { Ok(f) => { match serde_json::from_reader(f) { Ok(data) => { match (data) { serde_json::Value::Array(arr) =>{ - + for item in arr { + if let serde_json::Value::Object(obj) = item { + meta.deserialize_json(&obj); + } + } }, serde_json::Value::Object(obj) =>{ - let msg = Rc::new(meta.dummy.clone()); - let id_key = &mut 0; - let name_key = &mut String::new(); - msg.deserialize(&obj, id_key, name_key); - meta.wrap_list.push(msg); + meta.deserialize_json(&obj); }, _ => {