From 706be6c8faa1dac2d0824715ab53797e57aaa7af Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 31 Dec 2021 19:05:49 +0800 Subject: [PATCH] 1 --- Cargo.toml | 4 ++++ src/lib.rs | 1 + src/metamgr.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 98382a9..73b6357 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +protobuf = "2.9.0" +serde = "*" +serde_derive = "*" +serde_json = "*" diff --git a/src/lib.rs b/src/lib.rs index abf67de..ab25a24 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,3 +12,4 @@ mod metamgr; pub use xvalue::XValue; pub use metamgr::MetaMgr; +pub use metamgr::ProtoMsg; diff --git a/src/metamgr.rs b/src/metamgr.rs index 11dbfe2..d39b0b7 100644 --- a/src/metamgr.rs +++ b/src/metamgr.rs @@ -1,11 +1,22 @@ use std::rc::Rc; +use std::fs::File; use std::collections::HashMap; +use protobuf::Message; +use protobuf::descriptor::FieldDescriptorProto_Type; + +pub trait ProtoMsg { + fn get_proto(&self) -> &dyn Message; + fn init1(&self) {} + fn init2(&self) {} + fn init3(&self) {} +} struct MetaClass { file_name: String, idx: i32, prim_key: String, sec_key: String, + dummy: T, wrap_list: Vec>, wrap_id_hash: HashMap>, wrap_name_hash: HashMap> @@ -15,7 +26,22 @@ pub struct MetaMgr { meta_classes: Vec>, } -impl MetaMgr { +fn json_to_pb(obj: &serde_json::Map, pb: &dyn protobuf::Message) { + let desc = pb.descriptor(); + for field in desc.fields() { + let field_desc = field.proto(); + match obj.get(field.name()) { + Some(v) => { + + } + None => { + + } + } + } +} + +impl MetaMgr { pub fn new() -> Self { return MetaMgr::{ @@ -31,6 +57,38 @@ impl MetaMgr { } + pub fn load(&mut self) { + for meta in &mut self.meta_classes { + match File::open(&meta.file_name) { + Ok(f) => { + match serde_json::from_reader(f) { + Ok(data) => { + match (data) { + serde_json::Value::Array(arr) =>{ + + }, + serde_json::Value::Object(obj) =>{ + let msg = Rc::new(meta.dummy.clone()); + json_to_pb(&obj, msg.get_proto()); + meta.wrap_list.push(msg); + }, + _ => { + + } + } + } + Err(e) => { + + } + } + } + Err(e) => { + + } + } + } + } + pub fn get_metalist(&mut self, idx: i32) -> Option<&Vec::>> { if idx >= 0 && idx as usize <= self.meta_classes.len() { return Some(&self.meta_classes[idx as usize].wrap_list); @@ -47,7 +105,7 @@ impl MetaMgr { } pub fn internal_get_byid(&mut self, idx: usize, id: i64) -> Option<&Rc> { - if idx <= self.meta_classes.len() { + if idx < self.meta_classes.len() { match self.meta_classes[idx].wrap_id_hash.get(&id) { Some(v) => { return Some(v); @@ -61,7 +119,7 @@ impl MetaMgr { } pub fn internal_get_byname(&mut self, idx: usize, name: String) -> Option<&Rc> { - if idx <= self.meta_classes.len() { + if idx < self.meta_classes.len() { match self.meta_classes[idx].wrap_name_hash.get(&name) { Some(v) => { return Some(v);