rmpv/encode/
value_ref.rs

1use std::io::Write;
2
3use rmp::encode::{write_bool, write_nil, write_sint, write_uint, write_f32, write_f64, write_str,
4                  write_bin, write_array_len, write_map_len, write_ext_meta};
5
6use crate::{Integer, IntPriv, Utf8StringRef, ValueRef};
7use super::Error;
8
9/// Encodes and attempts to write the given non-owning ValueRef into the Write.
10///
11/// # Errors
12///
13/// This function returns Error with an underlying I/O error if unable to properly write entire
14/// value. Interruption errors are handled internally by silent operation restarting.
15///
16/// # Examples
17/// ```
18/// use rmpv::ValueRef;
19/// use rmpv::encode::write_value_ref;
20///
21/// let mut buf = Vec::new();
22/// let val = ValueRef::from("le message");
23///
24/// write_value_ref(&mut buf, &val).unwrap();
25/// assert_eq!(vec![0xaa, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65], buf);
26/// ```
27pub fn write_value_ref<W>(wr: &mut W, val: &ValueRef<'_>) -> Result<(), Error>
28    where W: Write
29{
30    match *val {
31        ValueRef::Nil => {
32            write_nil(wr).map_err(|err| Error::InvalidMarkerWrite(err))?;
33        }
34        ValueRef::Boolean(val) => {
35            write_bool(wr, val).map_err(|err| Error::InvalidMarkerWrite(err))?;
36        }
37        ValueRef::Integer(Integer { n }) => {
38            match n {
39                IntPriv::PosInt(n) => {
40                    write_uint(wr, n)?;
41                }
42                IntPriv::NegInt(n) => {
43                    write_sint(wr, n)?;
44                }
45            }
46        }
47        ValueRef::F32(val) => {
48            write_f32(wr, val)?;
49        }
50        ValueRef::F64(val) => {
51            write_f64(wr, val)?;
52        }
53        ValueRef::String(Utf8StringRef { s }) => {
54            match s {
55                Ok(val) => write_str(wr, &val)?,
56                Err(err) => write_bin(wr, &err.0)?,
57            }
58        }
59        ValueRef::Binary(val) => {
60            write_bin(wr, val)?;
61        }
62        ValueRef::Array(ref vec) => {
63            write_array_len(wr, vec.len() as u32)?;
64            for v in vec {
65                write_value_ref(wr, v)?;
66            }
67        }
68        ValueRef::Map(ref map) => {
69            write_map_len(wr, map.len() as u32)?;
70            for &(ref key, ref val) in map {
71                write_value_ref(wr, key)?;
72                write_value_ref(wr, val)?;
73            }
74        }
75        ValueRef::Ext(ty, data) => {
76            write_ext_meta(wr, data.len() as u32, ty)?;
77            wr.write_all(data).map_err(|err| Error::InvalidDataWrite(err))?;
78        }
79    }
80
81    Ok(())
82}