messagepack_core/encode/
nil.rs

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