1
This commit is contained in:
parent
c8ca016ae7
commit
bd11c1108e
@ -1,8 +1,6 @@
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use protobuf::Message;
|
|
||||||
use protobuf::descriptor::FieldDescriptorProto_Type;
|
|
||||||
|
|
||||||
pub trait ProtoMsg {
|
pub trait ProtoMsg {
|
||||||
fn deserialize(&self,
|
fn deserialize(&self,
|
||||||
@ -25,28 +23,28 @@ struct MetaClass<T> {
|
|||||||
wrap_name_hash: HashMap<String, Rc<T>>
|
wrap_name_hash: HashMap<String, Rc<T>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: Clone + ProtoMsg> MetaClass<T> {
|
||||||
|
|
||||||
|
fn deserialize_json(&mut self, obj: &serde_json::Map<String, serde_json::Value>) {
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
pub struct MetaMgr<T> {
|
pub struct MetaMgr<T> {
|
||||||
meta_classes: Vec<MetaClass::<T>>,
|
meta_classes: Vec<MetaClass::<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn json_to_pb(obj: &serde_json::Map<String, serde_json::Value>, pb: &mut dyn protobuf::Message) {
|
|
||||||
let mut v = Vec::<u8>::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<T: Clone + ProtoMsg> MetaMgr<T> {
|
impl<T: Clone + ProtoMsg> MetaMgr<T> {
|
||||||
|
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
@ -63,22 +61,37 @@ impl<T: Clone + ProtoMsg> MetaMgr<T> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn register_meta(&mut self, file_name: String, idx: i32, prim_key: String, sec_key: String, dummy: T) {
|
||||||
|
let meta = MetaClass::<T> {
|
||||||
|
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) {
|
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) {
|
match File::open(&meta.file_name) {
|
||||||
Ok(f) => {
|
Ok(f) => {
|
||||||
match serde_json::from_reader(f) {
|
match serde_json::from_reader(f) {
|
||||||
Ok(data) => {
|
Ok(data) => {
|
||||||
match (data) {
|
match (data) {
|
||||||
serde_json::Value::Array(arr) =>{
|
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) =>{
|
serde_json::Value::Object(obj) =>{
|
||||||
let msg = Rc::new(meta.dummy.clone());
|
meta.deserialize_json(&obj);
|
||||||
let id_key = &mut 0;
|
|
||||||
let name_key = &mut String::new();
|
|
||||||
msg.deserialize(&obj, id_key, name_key);
|
|
||||||
meta.wrap_list.push(msg);
|
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user