Decode

Trait Decode 

Source
pub trait Decode<'a>: Sized {
    // Required method
    fn decode(r: &mut &'a [u8]) -> Result<Self>;
}
Expand description

The Decode trait allows objects to be read from the Minecraft protocol. It is the inverse of Encode.

Decode is parameterized by a lifetime. This allows the decoded value to borrow data from the byte slice it was read from.

§Deriving

This trait can be implemented automatically for structs and enums by using the Decode derive macro. All components of the type must implement Decode. Components are decoded in the order they appear in the type definition.

For enums, the variant to decode is determined by a leading VarInt discriminant (tag). The discriminant value can be changed using the #[packet(tag = ...)] attribute on the variant in question. Discriminant values are assigned to variants using rules similar to regular enum discriminants.

use chunkedge_binary::Decode;

#[derive(PartialEq, Debug, Decode)]
struct MyStruct {
    first: i32,
    second: MyEnum,
}

#[derive(PartialEq, Debug, Decode)]
enum MyEnum {
    First,  // tag = 0
    Second, // tag = 1
    #[packet(tag = 25)]
    Third, // tag = 25
    Fourth, // tag = 26
}

let mut r: &[u8] = &[0, 0, 0, 0, 26];

let value = MyStruct::decode(&mut r).unwrap();
let expected = MyStruct {
    first: 0,
    second: MyEnum::Fourth,
};

assert_eq!(value, expected);
assert!(r.is_empty());

Required Methods§

Source

fn decode(r: &mut &'a [u8]) -> Result<Self>

Reads this object from the provided byte slice.

Implementations of Decode are expected to shrink the slice from the front as bytes are read.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl Decode<'_> for EntityAttributeOperation

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for BlockKind

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for ItemKind

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for bool

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for f32

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for f64

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for i8

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for i16

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for i32

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for i64

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for i128

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for u8

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for u16

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for u32

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for u64

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for u128

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for BlockState

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Compound

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for NetworkCompound

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for RgbColor

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for JsonText

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Text

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Box<str>

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for String

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Quat

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Vec3A

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Vec4

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Vec2

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for Vec3

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for DQuat

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for DVec2

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for DVec3

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl Decode<'_> for IVec3

Source§

fn decode(r: &mut &[u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for &'a str

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for &'a [i8]

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for &'a [u8]

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for EntityAttribute

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for BlockEntityKind

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for ()

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for RegistryId

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a> Decode<'a> for Uuid

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>> Decode<'a> for (A,)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>> Decode<'a> for (A, B)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>> Decode<'a> for (A, B, C)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>> Decode<'a> for (A, B, C, D)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>> Decode<'a> for (A, B, C, D, E)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>> Decode<'a> for (A, B, C, D, E, F)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>, G: Decode<'a>> Decode<'a> for (A, B, C, D, E, F, G)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>, G: Decode<'a>, H: Decode<'a>> Decode<'a> for (A, B, C, D, E, F, G, H)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>, G: Decode<'a>, H: Decode<'a>, I: Decode<'a>> Decode<'a> for (A, B, C, D, E, F, G, H, I)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>, G: Decode<'a>, H: Decode<'a>, I: Decode<'a>, J: Decode<'a>> Decode<'a> for (A, B, C, D, E, F, G, H, I, J)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>, G: Decode<'a>, H: Decode<'a>, I: Decode<'a>, J: Decode<'a>, K: Decode<'a>> Decode<'a> for (A, B, C, D, E, F, G, H, I, J, K)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, A: Decode<'a>, B: Decode<'a>, C: Decode<'a>, D: Decode<'a>, E: Decode<'a>, F: Decode<'a>, G: Decode<'a>, H: Decode<'a>, I: Decode<'a>, J: Decode<'a>, K: Decode<'a>, L: Decode<'a>> Decode<'a> for (A, B, C, D, E, F, G, H, I, J, K, L)

Source§

fn decode(_r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, B> Decode<'a> for Cow<'_, B>
where B: ToOwned + ?Sized, B::Owned: Decode<'a>,

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, K, V> Decode<'a> for BTreeMap<K, V>
where K: Ord + Decode<'a>, V: Decode<'a>,

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, K, V, S> Decode<'a> for HashMap<K, V, S>
where K: Eq + Hash + Decode<'a>, V: Decode<'a>, S: BuildHasher + Default,

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, K: Decode<'a> + Hash + Eq, V: Decode<'a>> Decode<'a> for IndexMap<K, V>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, S> Decode<'a> for Ident<S>
where S: Decode<'a>, Ident<S>: TryFrom<S, Error = IdentError>,

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T> Decode<'a> for BTreeSet<T>
where T: Ord + Decode<'a>,

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T, S> Decode<'a> for HashSet<T, S>
where T: Eq + Hash + Decode<'a>, S: BuildHasher + Default,

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>> Decode<'a> for Option<T>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>> Decode<'a> for Box<[T]>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>> Decode<'a> for Box<T>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>> Decode<'a> for Rc<T>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>> Decode<'a> for Arc<T>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>> Decode<'a> for Vec<T>

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, T: Decode<'a>, const N: usize> Decode<'a> for [T; N]

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Source§

impl<'a, const N: usize> Decode<'a> for &'a [u8; N]

References to fixed-length arrays are not length prefixed.

Source§

fn decode(r: &mut &'a [u8]) -> Result<Self>

Implementors§

Source§

impl Decode<'_> for VariableBitSet

Source§

impl Decode<'_> for ByteAngle

Source§

impl Decode<'_> for TextComponent

Source§

impl Decode<'_> for VarInt

Source§

impl Decode<'_> for VarLong

Source§

impl<'a> Decode<'a> for IDSet

Source§

impl<'a> Decode<'a> for RawBytes<'a>

Source§

impl<'a, T: Decode<'a> + Encode + Clone + Debug + PartialEq> Decode<'a> for IdOr<T>

Source§

impl<'a, T: Decode<'a>, const MAX_LEN: usize> Decode<'a> for Bounded<Box<[T]>, MAX_LEN>

Source§

impl<'a, T: Decode<'a>, const MAX_LEN: usize> Decode<'a> for Bounded<Vec<T>, MAX_LEN>

Source§

impl<'a, T: Decode<'a>, const N: usize> Decode<'a> for FixedArray<T, N>

Source§

impl<'a, const MAX_BYTES: usize> Decode<'a> for Bounded<RawBytes<'a>, MAX_BYTES>

Raises a decoding error if the remainder of the input is larger than MAX_BYTES.

Source§

impl<'a, const MAX_CHARS: usize> Decode<'a> for Bounded<&'a str, MAX_CHARS>

Source§

impl<'a, const MAX_LEN: usize> Decode<'a> for Bounded<&'a [u8], MAX_LEN>

Source§

impl<const BIT_COUNT: usize, const BYTE_COUNT: usize> Decode<'_> for FixedBitSet<BIT_COUNT, BYTE_COUNT>

Source§

impl<const MAX_CHARS: usize> Decode<'_> for Bounded<Box<str>, MAX_CHARS>

Source§

impl<const MAX_CHARS: usize> Decode<'_> for Bounded<String, MAX_CHARS>