Skip to main content

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