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
9pub 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}