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}