messagepack_core/encode/
nil.rs

1use 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}