#[conditionally_deserializable]
Available on crate feature conditional_deserialization only.
Expand description

The conditionally_deserializable attribute macro creates two versions of the affected struct: One that implements the Deserialize and DeserializeBytes traits and one that does not. It does so by introducing a boolean const generic that indicates if the struct can be deserialized or not.

This conditional deserialization can be used, for example, to implement a simple state machine, where after deserialization, the user must first complete an additional transition (e.g. verification) to the undeserializable version of the struct, which might then implement functions for further processing.

For ease of use, the macro creates type aliases for the deserializable and undeserializable variant of the struct, where the alias is the name of the struct prefixed with Deserializable or Undeserializable respectively.

Due to the way that the macro rewrites the struct, it must be placed before any #[derive(...)] statements.

The conditionally_deserializable attribute macro is only available if the conditional_deserialization feature is enabled.

use tls_codec_derive::{TlsSerialize, TlsDeserialize, TlsSize, conditionally_deserializable};

#[conditionally_deserializable(Bytes)]
#[derive(TlsDeserialize, TlsSerialize, TlsSize)]
struct ExampleStruct {
    pub a: u16,
}

impl UndeserializableExampleStruct {
    #[cfg(feature = "conditional_deserialization")]
    fn deserialize(bytes: &[u8]) -> Result<Self, tls_codec::Error> {
        Self::tls_deserialize_exact(bytes)
    }
}