1use bytes::Bytes;
24
25use crate::{
26 codec::Wire,
27 error::Result,
28 msgpack::{Decoder, Encoder, Integer, Kind},
29};
30
31#[derive(Debug, Clone, PartialEq)]
36pub enum Value {
37 Nil,
39 Bool(bool),
41 Int(Integer),
43 Float(f64),
45 Str(String),
47 Bin(Bytes),
49 Array(Vec<Value>),
51 Map(Vec<(Value, Value)>),
53 Ext(i8, Bytes),
55}
56
57impl From<&str> for Value {
58 fn from(value: &str) -> Self {
59 Value::Str(value.to_owned())
60 }
61}
62
63impl From<i64> for Value {
64 fn from(value: i64) -> Self {
65 Value::Int(if value < 0 {
66 Integer::Signed(value)
67 } else {
68 Integer::Unsigned(value as u64)
69 })
70 }
71}
72
73impl From<f64> for Value {
74 fn from(value: f64) -> Self {
75 Value::Float(value)
76 }
77}
78
79impl From<bool> for Value {
80 fn from(value: bool) -> Self {
81 Value::Bool(value)
82 }
83}
84
85impl Wire for Value {
86 fn encode(&self, encoder: &mut Encoder) {
87 match self {
88 Value::Nil => encoder.nil(),
89 Value::Bool(value) => encoder.bool(*value),
90 Value::Int(Integer::Signed(value)) => encoder.int(*value),
91 Value::Int(Integer::Unsigned(value)) => encoder.uint(*value),
92 Value::Float(value) => encoder.float(*value),
93 Value::Str(value) => encoder.str(value),
94 Value::Bin(value) => encoder.bin(value),
95 Value::Array(items) => {
96 encoder.array_len(items.len());
97 for item in items {
98 item.encode(encoder);
99 }
100 }
101 Value::Map(entries) => {
102 encoder.map_len(entries.len());
103 for (key, value) in entries {
104 key.encode(encoder);
105 value.encode(encoder);
106 }
107 }
108 Value::Ext(code, data) => encoder.ext(*code, data),
109 }
110 }
111
112 fn decode(decoder: &mut Decoder<'_>) -> Result<Self> {
113 Ok(match decoder.peek_kind()? {
114 Kind::Nil => {
115 decoder.take_nil()?;
116 Value::Nil
117 }
118 Kind::Bool => Value::Bool(decoder.bool()?),
119 Kind::Int => Value::Int(decoder.integer()?),
120 Kind::Float => Value::Float(decoder.float()?),
121 Kind::Str => Value::Str(decoder.str()?.to_owned()),
122 Kind::Bin => Value::Bin(decoder.bin()?),
123 Kind::Array => {
124 let len = decoder.array_len()?;
125 let mut items = Vec::with_capacity(len.min(4096));
126 for _ in 0..len {
127 items.push(Value::decode(decoder)?);
128 }
129 Value::Array(items)
130 }
131 Kind::Map => {
132 let len = decoder.map_len()?;
133 let mut entries = Vec::with_capacity(len.min(4096));
134 for _ in 0..len {
135 let key = Value::decode(decoder)?;
136 entries.push((key, Value::decode(decoder)?));
137 }
138 Value::Map(entries)
139 }
140 Kind::Ext => {
141 let (code, data) = decoder.ext()?;
142 Value::Ext(code, data)
143 }
144 })
145 }
146}