use std::rc::Rc; //use std::fs::File; use std::collections::HashMap; pub trait ProtoMsg { fn deserialize(&self, obj: &serde_json::Map, id_key: &mut i64, name_key: &mut String) {} 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> } impl MetaClass { fn deserialize_json(&mut self, idx: i64, 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 self.prim_key.is_empty() { self.wrap_id_hash.insert(idx, msg.clone()); } else { 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()); } } } fn test1(mgr: &MetaMgr, meta: &MetaClass) { } fn test2(mgr: &MetaMgr) { } pub struct MetaMgr { meta_classes: Vec>, } impl MetaMgr { pub fn new() -> Self { return MetaMgr::{ meta_classes: Vec::new() }; } pub fn init(&mut self) { } pub fn un_init(&mut self) { } 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); } fn test(&self, meta: &mut MetaClass::) { } pub fn load(&mut self) { /* for i in 0..self.meta_classes.len() { let meta = &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) =>{ let mut idx = 0; for item in arr { if let serde_json::Value::Object(obj) = item { //meta.deserialize_json(idx, &obj); idx = idx + 1; } } }, serde_json::Value::Object(obj) =>{ //meta.deserialize_json(0, &obj); }, _ => { } } } 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); } return None; } pub fn get_byid(&mut self, idx: i32, id: i64) -> Option<&Rc> { return self.internal_get_byid(idx as usize, id); } pub fn get_byname(&mut self, idx: i32, name: String) -> Option<&Rc> { return self.internal_get_byname(idx as usize, name); } pub fn internal_get_byid(&mut self, idx: usize, id: i64) -> Option<&Rc> { if idx < self.meta_classes.len() { match self.meta_classes[idx].wrap_id_hash.get(&id) { Some(v) => { return Some(v); } None => { } } } return None; } pub fn internal_get_byname(&mut self, idx: usize, name: String) -> Option<&Rc> { if idx < self.meta_classes.len() { match self.meta_classes[idx].wrap_name_hash.get(&name) { Some(v) => { return Some(v); } None => { } } } return None; } }