1
This commit is contained in:
parent
8e98dcffb3
commit
706be6c8fa
@ -6,3 +6,7 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
protobuf = "2.9.0"
|
||||||
|
serde = "*"
|
||||||
|
serde_derive = "*"
|
||||||
|
serde_json = "*"
|
||||||
|
@ -12,3 +12,4 @@ mod metamgr;
|
|||||||
|
|
||||||
pub use xvalue::XValue;
|
pub use xvalue::XValue;
|
||||||
pub use metamgr::MetaMgr;
|
pub use metamgr::MetaMgr;
|
||||||
|
pub use metamgr::ProtoMsg;
|
||||||
|
@ -1,11 +1,22 @@
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
use std::fs::File;
|
||||||
use std::collections::HashMap;
|
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<T> {
|
struct MetaClass<T> {
|
||||||
file_name: String,
|
file_name: String,
|
||||||
idx: i32,
|
idx: i32,
|
||||||
prim_key: String,
|
prim_key: String,
|
||||||
sec_key: String,
|
sec_key: String,
|
||||||
|
dummy: T,
|
||||||
wrap_list: Vec<Rc<T>>,
|
wrap_list: Vec<Rc<T>>,
|
||||||
wrap_id_hash: HashMap<i64, Rc<T>>,
|
wrap_id_hash: HashMap<i64, Rc<T>>,
|
||||||
wrap_name_hash: HashMap<String, Rc<T>>
|
wrap_name_hash: HashMap<String, Rc<T>>
|
||||||
@ -15,7 +26,22 @@ pub struct MetaMgr<T> {
|
|||||||
meta_classes: Vec<MetaClass::<T>>,
|
meta_classes: Vec<MetaClass::<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> MetaMgr<T> {
|
fn json_to_pb(obj: &serde_json::Map<String, serde_json::Value>, 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<T: Clone + ProtoMsg> MetaMgr<T> {
|
||||||
|
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
return MetaMgr::<T>{
|
return MetaMgr::<T>{
|
||||||
@ -31,6 +57,38 @@ impl<T> MetaMgr<T> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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::<Rc::<T>>> {
|
pub fn get_metalist(&mut self, idx: i32) -> Option<&Vec::<Rc::<T>>> {
|
||||||
if idx >= 0 && idx as usize <= self.meta_classes.len() {
|
if idx >= 0 && idx as usize <= self.meta_classes.len() {
|
||||||
return Some(&self.meta_classes[idx as usize].wrap_list);
|
return Some(&self.meta_classes[idx as usize].wrap_list);
|
||||||
@ -47,7 +105,7 @@ impl<T> MetaMgr<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn internal_get_byid(&mut self, idx: usize, id: i64) -> Option<&Rc<T>> {
|
pub fn internal_get_byid(&mut self, idx: usize, id: i64) -> Option<&Rc<T>> {
|
||||||
if idx <= self.meta_classes.len() {
|
if idx < self.meta_classes.len() {
|
||||||
match self.meta_classes[idx].wrap_id_hash.get(&id) {
|
match self.meta_classes[idx].wrap_id_hash.get(&id) {
|
||||||
Some(v) => {
|
Some(v) => {
|
||||||
return Some(v);
|
return Some(v);
|
||||||
@ -61,7 +119,7 @@ impl<T> MetaMgr<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn internal_get_byname(&mut self, idx: usize, name: String) -> Option<&Rc<T>> {
|
pub fn internal_get_byname(&mut self, idx: usize, name: String) -> Option<&Rc<T>> {
|
||||||
if idx <= self.meta_classes.len() {
|
if idx < self.meta_classes.len() {
|
||||||
match self.meta_classes[idx].wrap_name_hash.get(&name) {
|
match self.meta_classes[idx].wrap_name_hash.get(&name) {
|
||||||
Some(v) => {
|
Some(v) => {
|
||||||
return Some(v);
|
return Some(v);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user