diff --git a/crates/types/src/compound/enumerated.rs b/crates/types/src/compound/enumerated.rs index 5523fde..18df3dc 100644 --- a/crates/types/src/compound/enumerated.rs +++ b/crates/types/src/compound/enumerated.rs @@ -27,10 +27,15 @@ impl DiscriminantCodable

for Discr

{ } impl Discr

{ + pub fn new(u: u32) -> Self { + assert!(u < P::VALUE); + Self::new_unchecked(u) + } fn new_unchecked(u: u32) -> Self { Self(u, Default::default()) } } + impl Discr

{ fn dispatch, O>(&self, h: H) -> O { match self.0 { @@ -153,17 +158,22 @@ mod test { use super::*; #[test] fn dispatch() { - struct Receiver { - returns: f32, - } - impl VariantHandler for Receiver { - fn call(&self, _: T) -> f32 { - self.returns + struct Receiver; + impl> VariantHandler for Receiver { + fn call(&self, v: T) -> i32 { + unsafe { + v.try_into().unwrap_unchecked() + P::VALUE as i32 + 5 + } } } - let e: Enum<(Discr,), List<(u32, f32)>> = Enum::default(); - let r = Receiver { returns: 5f32 }; - assert_eq!(e.dispatch(r), 5f32); + let mut e: Enum<(Discr,), List<(u32, i32, u8)>> = Enum::default(); + assert_eq!(e.dispatch(Receiver), 5); + + e.encode_discr(Discr::new(1)); + assert_eq!(e.dispatch(Receiver), 6); + + e.encode_discr(Discr::new(2)); + assert_eq!(e.dispatch(Receiver), 7); } }