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}