#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum DiscriminantEncoding {
Signed,
Unsigned,
Bool,
}
pub trait XDRDiscriminant {
const ENCODING: DiscriminantEncoding;
fn discriminant(&self) -> i32;
fn from_discriminant(d: i32) -> Self
where
Self: Sized;
}
impl XDRDiscriminant for i32 {
const ENCODING: DiscriminantEncoding = DiscriminantEncoding::Signed;
fn discriminant(&self) -> i32 {
*self
}
fn from_discriminant(d: i32) -> Self {
d
}
}
impl XDRDiscriminant for u32 {
const ENCODING: DiscriminantEncoding = DiscriminantEncoding::Unsigned;
fn discriminant(&self) -> i32 {
*self as i32
}
fn from_discriminant(d: i32) -> Self {
d as u32
}
}
impl XDRDiscriminant for bool {
const ENCODING: DiscriminantEncoding = DiscriminantEncoding::Bool;
fn discriminant(&self) -> i32 {
i32::from(*self)
}
fn from_discriminant(d: i32) -> Self {
d != 0
}
}