1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use std::io::Write;
use rmp::encode::{write_bool, write_nil, write_sint, write_uint, write_f32, write_f64, write_str,
write_bin, write_array_len, write_map_len, write_ext_meta};
use {Integer, IntPriv, Utf8StringRef, ValueRef};
use super::Error;
pub fn write_value_ref<W>(wr: &mut W, val: &ValueRef) -> Result<(), Error>
where W: Write
{
match *val {
ValueRef::Nil => {
write_nil(wr).map_err(|err| Error::InvalidMarkerWrite(err))?;
}
ValueRef::Boolean(val) => {
write_bool(wr, val).map_err(|err| Error::InvalidMarkerWrite(err))?;
}
ValueRef::Integer(Integer { n }) => {
match n {
IntPriv::PosInt(n) => {
write_uint(wr, n)?;
}
IntPriv::NegInt(n) => {
write_sint(wr, n)?;
}
}
}
ValueRef::F32(val) => {
write_f32(wr, val)?;
}
ValueRef::F64(val) => {
write_f64(wr, val)?;
}
ValueRef::String(Utf8StringRef { s }) => {
match s {
Ok(val) => write_str(wr, &val)?,
Err(err) => write_bin(wr, &err.0)?,
}
}
ValueRef::Binary(val) => {
write_bin(wr, val)?;
}
ValueRef::Array(ref vec) => {
write_array_len(wr, vec.len() as u32)?;
for v in vec {
write_value_ref(wr, v)?;
}
}
ValueRef::Map(ref map) => {
write_map_len(wr, map.len() as u32)?;
for &(ref key, ref val) in map {
write_value_ref(wr, key)?;
write_value_ref(wr, val)?;
}
}
ValueRef::Ext(ty, data) => {
write_ext_meta(wr, data.len() as u32, ty)?;
wr.write_all(data).map_err(|err| Error::InvalidDataWrite(err))?;
}
}
Ok(())
}