use bevy_reflect::{
Reflect,Struct
};
use std::default::Default;
use crate::{mylog};
use crate::myerror::MyError;
pub trait IDbModel:Reflect+Default+Struct {
fn prepare<F>(&mut self,mut f:F) ->Result<& mut Self,MyError> where F: FnMut(& mut Self) {
f(self);
Ok(self)
}
fn prepare_with_defaults<F>(&mut self,mut f:F) ->Result<& mut Self,MyError> where F: FnMut(& mut Self) {
let mut info = self.clone_dynamic();
for (i, value) in self.iter_fields().enumerate() {
let name = self.name_at(i).unwrap();
match value.type_name() {
"alloc::string::String" => {
info.insert(name, String::from(crate::db::STRING_DEFAULT));
}
"i32" => {
info.insert(name, crate::db::INT32_DEFAULT);
}
"i64" => {
info.insert(name, crate::db::INT64_DEFAULT);
}
"f32" => {
info.insert(name, crate::db::FLOAT32_DEFAULT);
}
"f64" => {
info.insert(name, crate::db::FLOAT64_DEFAULT);
}
"usc::db::const_type_defaults::Bool"=>{
info.insert(name, crate::db::BOOL_DEFAULT);
}
&_ => {
mylog!("value.type_name()",value.type_name());
todo!();
},
}
}
self.apply(&info);
f(self);
Ok(self)
}
fn has_id(&self) -> bool {
let field: &dyn Reflect = self.field("id").unwrap();
let val = field.downcast_ref::<i64>().unwrap();
match *val {
0 | crate::db::INT64_DEFAULT => false,
_ => true,
}
}
fn id(&self) -> i64 {
let field: &dyn Reflect = self.field("id").unwrap();
let val = field.downcast_ref::<i64>().unwrap();
*val
}
}