messagepack_core/encode/
nil.rs1use super::{Encode, Result};
2use crate::{formats::Format, io::IoWrite};
3
4pub struct NilEncoder;
5
6impl<W: IoWrite> Encode<W> for NilEncoder {
7 fn encode(&self, writer: &mut W) -> Result<usize, <W as IoWrite>::Error> {
8 writer.write_bytes(&Format::Nil.as_slice())?;
9 Ok(1)
10 }
11}
12
13impl<W: IoWrite> Encode<W> for () {
14 fn encode(&self, writer: &mut W) -> Result<usize, <W as IoWrite>::Error> {
15 NilEncoder.encode(writer)
16 }
17}
18
19impl<W, V> Encode<W> for Option<V>
20where
21 W: IoWrite,
22 V: Encode<W>,
23{
24 fn encode(&self, writer: &mut W) -> Result<usize, <W as IoWrite>::Error> {
25 match self {
26 Some(other) => other.encode(writer),
27 _ => NilEncoder.encode(writer),
28 }
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
37 fn encode_nil() {
38 let mut buf = vec![];
39 NilEncoder.encode(&mut buf).unwrap();
40
41 let expected: &[u8] = &[0xc0];
42 assert_eq!(&buf, expected);
43 }
44
45 #[test]
46 fn encode_none() {
47 let mut buf = vec![];
48 let option: Option<i32> = None;
49 option.encode(&mut buf).unwrap();
50
51 let expected: &[u8] = &[0xc0];
52 assert_eq!(&buf, expected);
53 }
54
55 #[test]
56 fn encode_some() {
57 let mut buf = vec![];
58 let option: Option<u8> = Some(0x80);
59 option.encode(&mut buf).unwrap();
60
61 let expected: &[u8] = &[0xcc, 0x80];
62 assert_eq!(&buf, expected);
63 }
64}