FunctionManager: improve serdes pattern

This commit is contained in:
Simon Gardling 2025-12-05 00:40:46 -05:00
parent d6cb0fba1a
commit 905820384a
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D

View File

@ -9,6 +9,8 @@ use std::hash::{Hash, Hasher};
use std::ops::BitXorAssign; use std::ops::BitXorAssign;
type Functions = Vec<(Id, FunctionEntry)>; type Functions = Vec<(Id, FunctionEntry)>;
#[derive(Serialize, Deserialize)]
pub struct FunctionManager { pub struct FunctionManager {
functions: Functions, functions: Functions,
} }
@ -17,45 +19,26 @@ impl Default for FunctionManager {
fn default() -> Self { fn default() -> Self {
let mut vec: Functions = Vec::with_capacity(COLORS.len()); let mut vec: Functions = Vec::with_capacity(COLORS.len());
vec.push(( vec.push((
Id::new(11414819524356497634_u64), // Random number here to avoid call to crate::misc::random_u64() Id::new("Function Manager"),
FunctionEntry::default(), FunctionEntry::default(),
)); ));
Self { functions: vec } Self { functions: vec }
} }
} }
impl Serialize for FunctionManager { #[test]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn func_manager_roundtrip_serdes() {
where let mut func_manager = FunctionManager {
S: Serializer, functions: Vec::new(),
{ };
let mut s = serializer.serialize_struct("FunctionManager", 1)?;
s.serialize_field(
"data",
&self
.functions
.iter()
.map(|(id, func)| (*id, func.clone()))
.collect::<Vec<(Id, FunctionEntry)>>(),
)?;
s.end()
}
}
impl<'de> Deserialize<'de> for FunctionManager { func_manager.push_empty();
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> let ser = bincode::serialize(&func_manager).expect("unable to serialize");
where let des: FunctionManager = bincode::deserialize(&ser).expect("unable to deserialize");
D: Deserializer<'de>, assert_eq!(
{ func_manager.functions[0].1.raw_func_str,
#[derive(Deserialize)] des.functions[0].1.raw_func_str
struct Helper(Vec<(Id, FunctionEntry)>); );
let helper = Helper::deserialize(deserializer)?;
Ok(FunctionManager {
functions: helper.0.to_vec(),
})
}
} }
/// Function that creates button that's used with the `button_area` /// Function that creates button that's used with the `button_area`