musli_core/en/
encode.rs

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