musli_core/en/
encode_bytes.rs

1use crate::en::Encoder;
2
3/// Trait governing how a type is encoded as bytes.
4///
5/// This is typically used automatically through the `#[musli(bytes)]` attribute
6/// through the [`Encode` derive].
7///
8/// [`Encode` derive]: https://docs.rs/musli/latest/musli/help/derives/
9///
10/// # Examples
11///
12/// ```
13/// use musli::Encode;
14///
15/// #[derive(Encode)]
16/// struct MyType {
17///     #[musli(bytes)]
18///     data: [u8; 128],
19/// }
20/// ```
21///
22/// Implementing manually:
23///
24/// ```
25/// use musli::{Encode, Encoder};
26/// use musli::en::EncodeBytes;
27///
28/// struct MyType {
29///     data: [u8; 128],
30/// }
31///
32/// impl<M> Encode<M> for MyType {
33///     fn encode<E>(&self, cx: &E::Cx, encoder: E) -> Result<E::Ok, E::Error>
34///     where
35///         E: Encoder,
36///     {
37///         self.data.encode_bytes(cx, encoder)
38///     }
39/// }
40/// ```
41pub trait EncodeBytes<M> {
42    /// Encode the given output as bytes.
43    fn encode_bytes<E>(&self, cx: &E::Cx, encoder: E) -> Result<E::Ok, E::Error>
44    where
45        E: Encoder<Mode = M>;
46}
47
48impl<T, M> EncodeBytes<M> for &T
49where
50    T: ?Sized + EncodeBytes<M>,
51{
52    #[inline]
53    fn encode_bytes<E>(&self, cx: &E::Cx, encoder: E) -> Result<E::Ok, E::Error>
54    where
55        E: Encoder<Mode = M>,
56    {
57        (**self).encode_bytes(cx, encoder)
58    }
59}
60
61impl<T, M> EncodeBytes<M> for &mut T
62where
63    T: ?Sized + EncodeBytes<M>,
64{
65    #[inline]
66    fn encode_bytes<E>(&self, cx: &E::Cx, encoder: E) -> Result<E::Ok, E::Error>
67    where
68        E: Encoder<Mode = M>,
69    {
70        (**self).encode_bytes(cx, encoder)
71    }
72}