Trait borsh::de::EnumExt

source ·
pub trait EnumExt: BorshDeserialize {
    // Required method
    fn deserialize_variant<R: Read>(reader: &mut R, tag: u8) -> Result<Self>;
}
Expand description

Additional methods offered on enums which uses [derive(BorshDeserialize)].

Required Methods§

source

fn deserialize_variant<R: Read>(reader: &mut R, tag: u8) -> Result<Self>

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());

Implementors§