Trait switchboard_solana::prelude::borsh::de::EnumExt
pub trait EnumExt: BorshDeserialize {
// Required method
fn deserialize_variant<R>(reader: &mut R, tag: u8) -> Result<Self, Error>
where R: Read;
}
Expand description
Additional methods offered on enums which uses [derive(BorshDeserialize)]
.
Required Methods§
fn deserialize_variant<R>(reader: &mut R, tag: u8) -> Result<Self, Error>where
R: Read,
fn deserialize_variant<R>(reader: &mut R, tag: u8) -> Result<Self, Error>where
R: Read,
Deserialises given variant of an enum from the reader.
This may be used to perform validation or filtering based on what variant is being deserialised.
use borsh::BorshDeserialize;
use borsh::de::EnumExt as _;
#[derive(Debug, PartialEq, Eq, BorshDeserialize)]
enum MyEnum {
Zero,
One(u8),
Many(Vec<u8>)
}
#[derive(Debug, PartialEq, Eq)]
struct OneOrZero(MyEnum);
impl borsh::de::BorshDeserialize for OneOrZero {
fn deserialize_reader<R: borsh::maybestd::io::Read>(
reader: &mut R,
) -> borsh::maybestd::io::Result<Self> {
use borsh::de::EnumExt;
let tag = u8::deserialize_reader(reader)?;
if tag == 2 {
Err(borsh::maybestd::io::Error::new(
borsh::maybestd::io::ErrorKind::InvalidInput,
"MyEnum::Many not allowed here",
))
} else {
MyEnum::deserialize_variant(reader, tag).map(Self)
}
}
}
let data = b"\0";
assert_eq!(MyEnum::Zero, MyEnum::try_from_slice(&data[..]).unwrap());
assert_eq!(MyEnum::Zero, OneOrZero::try_from_slice(&data[..]).unwrap().0);
let data = b"\x02\0\0\0\0";
assert_eq!(MyEnum::Many(Vec::new()), MyEnum::try_from_slice(&data[..]).unwrap());
assert!(OneOrZero::try_from_slice(&data[..]).is_err());
Object Safety§
This trait is not object safe.