Hello. How can this code be improved?
I often have to repeat this piece of code:
match self
{
DbVar::U8(var_type) => {
// any code...
},
DbVar::BOOL(var_type) => {
// any code...
},
_ => { panic!("not supported type") },
};
How can it be improved?
Code:
use core::any::Any;
use core::fmt::Display;
use serde_derive::{Serialize, Deserialize};
pub type GenericVarType = Box<dyn Any + Send + Sync>;
//Generic variable
#[derive(Debug)]
pub struct GenericVar<T: Any + Display>
{
pub name: String,
pub value: T,
// any fields...
}
//Generic variable as enum
#[derive(Debug)]
pub enum DbVar
{
BOOL(GenericVarType),
U8(GenericVarType),
U16(GenericVarType),
U32(GenericVarType),
U64(GenericVarType),
I8(GenericVarType),
I16(GenericVarType),
I32(GenericVarType),
I64(GenericVarType),
F32(GenericVarType),
F64(GenericVarType),
STRING(GenericVarType),
}
impl DbVar
{
fn set_value<T: Any + Display>(&mut self, new_value: T)
{
match self
{
DbVar::U8(var_type) => {
let var = var_type.downcast_mut::<GenericVar<T>>().expect("Cannot cast to U8");
var.value = new_value;
},
_ => { panic!("not supported type") },
};
}
pub fn to_json(&self) -> String
{
#[derive(Serialize, Deserialize)]
struct VarJson {
name: String,
value: String,
};
fn convert<T: Any + Display>(var: &GenericVar<T>) -> VarJson
{
let value = var.value.to_string();
VarJson{name: var.name.clone(), value}
}
let var_json = match self
{
DbVar::U8(var_type) => {
let var = var_type.downcast_ref::<GenericVar<u8>>().expect("Cannot cast to U8");
convert(var)
},
DbVar::BOOL(var_type) => {
let var = var_type.downcast_ref::<GenericVar<bool>>().expect("Cannot cast to U8");
convert(var)
},
_ => { panic!("not supported type") },
};
return serde_json::to_string(&var_json).expect("Cannot convert to JSON");
}
pub fn do_something(&self)
{
match self
{
DbVar::U8(_var_type) => {
//...any code
},
DbVar::BOOL(_var_type) => {
//..any code
},
_ => { panic!("not supported type") },
};
}
}
pub type DbVarVec = Vec<DbVar>;
fn main()
{
let mut var1 = DbVar::U8(Box::new(GenericVar::<u8>{name: "var1".to_string(), value: 123}));
let var2 = DbVar::BOOL(Box::new(GenericVar::<bool>{name: "var2".to_string(), value: true}));
var1.set_value(243 as u8);
let mut db = DbVarVec::new();
db.push(var1);
db.push(var2);
for elm in db.iter()
{
println!("element: {:?}", elm);
println!("json: {}", elm.to_json());
}
}