Crate tls_codec_derive
source · [−]Expand description
Derive macros for traits in tls_codec
Warning
The derive macros support deriving the tls_codec
traits for enumerations and the resulting
serialized format complies with the “variants” section of the TLS RFC.
However support is limited to enumerations that are serialized with their discriminant
immediately followed by the variant data. If this is not appropriate (e.g. the format requires
other fields between the discriminant and variant data), the tls_codec
traits can be
implemented manually.
Available attributes
with
#[tls_codec(with = "prefix")]
This attribute may be applied to a struct field. It indicates that deriving any of the
tls_codec
traits for the containing struct calls the following functions:
prefix::tls_deserialize
when derivingDeserialize
prefix::tls_serialize
when derivingSerialize
prefix::tls_serialized_len
when derivingSize
prefix
can be a path to a module, type or trait where the functions are defined.
Their expected signatures match the corresponding methods in the traits.
use tls_codec_derive::{TlsSerialize, TlsSize};
#[derive(TlsSerialize, TlsSize)]
struct Bytes {
#[tls_codec(with = "bytes")]
values: Vec<u8>,
}
mod bytes {
use std::io::Write;
use tls_codec::{Serialize, Size, TlsByteSliceU32};
pub fn tls_serialized_len(v: &[u8]) -> usize {
TlsByteSliceU32(v).tls_serialized_len()
}
pub fn tls_serialize<W: Write>(v: &[u8], writer: &mut W) -> Result<usize, tls_codec::Error> {
TlsByteSliceU32(v).tls_serialize(writer)
}
}
discriminant
#[tls_codec(discriminant = 123)]
This attribute may be applied to an enum variant to specify the discriminant to use when
serializing it. If all variants are units (e.g. they do not have any data), this attribute
must not be used and the desired discriminants should be assigned to the variants using
standard Rust syntax (Variant = Discriminant
).
For enumerations with non-unit variants, if no variant has this attribute, the serialization discriminants will start from zero. If this attribute is used on a variant and the following variant does not have it, its discriminant will be equal to the previous variant discriminant plus 1.
use tls_codec_derive::{TlsSerialize, TlsSize};
#[derive(TlsSerialize, TlsSize)]
#[repr(u8)]
enum Token {
#[tls_codec(discriminant = 5)]
Int(u32),
Bytes([u8; 16]),
}