1use std::convert::{Into, TryFrom};
2use std::fmt::{self, Debug, Display};
3use std::iter::Iterator;
4use std::str::{self, FromStr};
5use std::string::*;
6
7#[cfg(feature = "serde")]
8use serde::{
9 de::{self, MapAccess, SeqAccess, Visitor},
10 ser::SerializeMap,
11 Deserialize, Deserializer, Serialize, Serializer,
12};
13
14use crate::*;
15
16#[derive(Debug, PartialEq, Eq, Clone, Copy)]
18pub enum Quote {
19 None,
20 Single,
21 Double,
22 Braces,
23}
24
25#[derive(Clone, PartialEq)]
26pub enum Number {
28 Hex(u64),
29 Dec(i64),
30 Oct(u64),
31}
32
33impl Debug for Number {
34 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
35 write!(f, "Num:<{self}>")
36 }
37}
38
39impl Display for Number {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 match self {
42 Number::Hex(n) => write!(f, "0x{n:x}"),
43 Number::Oct(n) => write!(f, "0o{n:o}"),
44 Number::Dec(n) => write!(f, "{n}"),
45 }
46 }
47}
48
49impl FromStr for Number {
50 type Err = std::num::ParseIntError;
51 fn from_str(s: &str) -> Result<Self, Self::Err> {
52 if let Some(s) = s.strip_prefix("0x") {
53 Ok(Number::Hex(u64::from_str_radix(s, 16)?))
54 } else if let Some(s) = s.strip_prefix("0o") {
55 Ok(Number::Oct(u64::from_str_radix(s, 8)?))
56 } else {
57 Ok(Number::Dec(i64::from_str(s)?))
58 }
59 }
60}
61
62#[cfg(feature = "serde")]
63impl Serialize for Number {
64 #[inline(always)]
65 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
66 match self {
67 Number::Dec(n) => s.serialize_i64(*n),
68 _ => s.collect_str(&self),
69 }
70 }
71}
72
73#[cfg(feature = "serde")]
74impl<'de> Deserialize<'de> for Number {
75 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
76 d.deserialize_any(NumberVisitor)
77 }
78}
79
80#[cfg(feature = "serde")]
81struct NumberVisitor;
82
83#[cfg(feature = "serde")]
84impl Visitor<'_> for NumberVisitor {
85 type Value = Number;
86
87 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
88 formatter.write_str("a string or an integer")
89 }
90
91 fn visit_i64<E: de::Error>(self, value: i64) -> Result<Self::Value, E> {
92 Ok(Number::Dec(value))
93 }
94
95 fn visit_u64<E: de::Error>(self, value: u64) -> Result<Self::Value, E> {
96 Ok(Number::Dec(value as _))
97 }
98
99 fn visit_str<E: de::Error>(self, value: &str) -> Result<Self::Value, E> {
100 Number::from_str(value).map_err(E::custom)
101 }
102}
103
104#[derive(Clone, PartialEq)]
106pub enum Value<'a> {
107 Empty,
109 Str(&'a [u8], Quote),
111 Number(Number),
113 List(Vec<Value<'a>>),
115 Owned(Vec<u8>),
118 Map(Vec<(Key, Value<'a>)>),
120 Segments(Vec<&'a [u8]>),
122 StringifiedList(Vec<Value<'a>>),
123 Skipped((usize, usize)),
125 Literal(&'static str),
127}
128
129impl Default for Value<'_> {
130 fn default() -> Self {
131 Self::Empty
132 }
133}
134
135impl Value<'_> {
136 pub fn str_len(&self) -> usize {
137 match self {
138 Value::Str(r, _) => r.len(),
139 Value::Segments(vr) => vr.iter().map(|r| r.len()).sum(),
140 _ => 0,
141 }
142 }
143}
144
145impl TryFrom<Value<'_>> for Vec<u8> {
146 type Error = &'static str;
147 fn try_from(v: Value) -> Result<Self, Self::Error> {
148 match v {
149 Value::Str(r, Quote::Braces) => {
150 let mut s = Vec::with_capacity(r.len() + 2);
151 s.push(b'{');
152 s.extend(Vec::from(r));
153 s.push(b'}');
154 Ok(s)
155 }
156 Value::Str(r, _) => Ok(Vec::from(r)),
157 Value::Empty => Ok("".into()),
158 Value::Segments(ranges) => {
159 let l = ranges.iter().map(|r| r.len()).sum();
160 let mut sb = Vec::with_capacity(l);
161 for r in ranges {
162 sb.extend(Vec::from(r));
163 }
164 Ok(sb)
165 }
166 Value::Number(_) => Err("Won't convert number to string"),
167 Value::List(_) | Value::StringifiedList(_) => Err("Can't convert list to scalar"),
168 Value::Map(_) => Err("Can't convert map to scalar"),
169 Value::Skipped(_) => Err("Can't convert skipped to scalar"),
170 Value::Literal(s) => Ok(s.to_string().into()),
171 Value::Owned(v) => Ok(v),
172 }
173 }
174}
175
176impl TryFrom<Value<'_>> for Vec<Vec<u8>> {
177 type Error = &'static str;
178 fn try_from(value: Value) -> Result<Self, Self::Error> {
179 match value {
180 Value::List(values) | Value::StringifiedList(values) => {
181 let mut rv = Vec::with_capacity(values.len());
182 for v in values {
183 let s = Vec::try_from(v)?;
184 rv.push(s);
185 }
186 Ok(rv)
187 }
188 _ => Err("not a list"),
189 }
190 }
191}
192
193impl Debug for Value<'_> {
194 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
195 match self {
196 Value::Str(r, _q) => write!(f, "Str:<{}>", &String::from_utf8_lossy(r)),
197 Value::Empty => write!(f, "Empty"),
198 Value::Segments(segs) => {
199 write!(f, "Segments<")?;
200 for (n, r) in segs.iter().enumerate() {
201 if n > 0 {
202 write!(f, ", ")?;
203 }
204 write!(f, "{}", String::from_utf8_lossy(r))?;
205 }
206 write!(f, ">")
207 }
208 Value::List(vs) => {
209 write!(f, "List:<")?;
210 for (n, v) in vs.iter().enumerate() {
211 if n > 0 {
212 write!(f, ", ")?;
213 }
214 match v {
215 Value::Str(r, _) => {
216 write!(f, "{}", String::from_utf8_lossy(r))?;
217 }
218 Value::Segments(rs) => {
219 for r in rs {
220 write!(f, "{}", String::from_utf8_lossy(r))?;
221 }
222 }
223 Value::Number(n) => write!(f, "{n:?}")?,
224 Value::Skipped((elems, bytes)) => {
225 write!(f, "Skip<elems{elems} bytes={bytes}>")?;
226 }
227 Value::Empty => panic!("list can't contain empty value"),
228 Value::List(_) | Value::StringifiedList(_) => {
229 panic!("list can't contain list")
230 }
231 Value::Map(_) => panic!("list can't contain map"),
232 Value::Literal(v) => write!(f, "{v:?}")?,
233 Value::Owned(v) => write!(f, "{}", String::from_utf8_lossy(v))?,
234 }
235 }
236 write!(f, ">")
237 }
238 Value::StringifiedList(vs) => {
239 write!(f, "StringifiedList:<")?;
240 for (n, v) in vs.iter().enumerate() {
241 if n > 0 {
242 write!(f, " ")?;
243 }
244 match v {
245 Value::Str(r, _) => {
246 write!(f, "{}", String::from_utf8_lossy(r))?;
247 }
248 Value::Segments(rs) => {
249 for r in rs {
250 write!(f, "{}", String::from_utf8_lossy(r))?;
251 }
252 }
253 Value::Number(n) => write!(f, "{n:?}")?,
254 Value::Skipped((elems, bytes)) => {
255 write!(f, "Skip<elems={elems} bytes={bytes}>")?;
256 }
257 Value::Empty => panic!("list can't contain empty value"),
258 Value::List(_) | Value::StringifiedList(_) => {
259 panic!("list can't contain list")
260 }
261 Value::Map(_) => panic!("List can't contain mapr"),
262 Value::Literal(v) => write!(f, "{v}")?,
263 Value::Owned(v) => write!(f, "{}", String::from_utf8_lossy(v))?,
264 }
265 }
266 write!(f, ">")
267 }
268 Value::Map(vs) => {
269 write!(f, "Map:<")?;
270 for (n, (k, v)) in vs.iter().enumerate() {
271 if n > 0 {
272 write!(f, " ")?;
273 }
274 write!(f, "{k:?}={v:?}")?;
275 }
276 write!(f, ">")
277 }
278 Value::Number(n) => write!(f, "{n:?}"),
279 Value::Skipped((elems, bytes)) => write!(f, "Skip<elems={elems} bytes={bytes}>"),
280 Value::Literal(s) => write!(f, "{s:?}"),
281 Value::Owned(v) => write!(f, "{}", String::from_utf8_lossy(v)),
282 }
283 }
284}
285
286#[cfg(feature = "serde")]
287impl Serialize for Value<'_> {
288 #[inline(always)]
289 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
290 match self {
291 Value::Empty => s.serialize_unit(),
292 Value::Str(r, Quote::Braces) => {
293 let mut buf = Vec::with_capacity(r.len() + 2);
294 buf.push(b'{');
295 buf.extend(*r);
296 buf.push(b'}');
297 s.serialize_bytes(&buf)
298 }
299 Value::Str(r, _) => s.serialize_bytes(r),
300 Value::Segments(segs) => {
301 let l = segs.iter().map(|r| r.len()).sum();
302 let mut buf = Vec::with_capacity(l);
303 for seg in segs {
304 buf.extend(*seg);
305 }
306 s.serialize_bytes(&buf)
307 }
308 Value::List(vs) => s.collect_seq(vs.iter()),
309 Value::StringifiedList(vs) => {
310 let mut buf: Vec<u8> = Vec::with_capacity(vs.len());
311 let mut first = true;
312 for v in vs {
313 if first {
314 first = false;
315 } else {
316 buf.push(b' ');
317 }
318 if let Value::Skipped((args, bytes)) = v {
319 buf.extend(format!("<<< Skipped: args={args}, bytes={bytes} >>>").bytes());
320 } else {
321 buf.extend(v.clone().try_into().unwrap_or_else(|_| vec![b'x']));
322 }
323 }
324 s.serialize_bytes(&buf)
325 }
326 Value::Number(n) => n.serialize(s),
327 Value::Map(vs) => s.collect_map(vs.iter().cloned()),
328 Value::Skipped((args, bytes)) => {
329 let mut map = s.serialize_map(Some(2))?;
330 map.serialize_entry("skipped_args", args)?;
331 map.serialize_entry("skipped_bytes", bytes)?;
332 map.end()
333 }
334 Value::Literal(v) => s.collect_str(v),
335 Value::Owned(v) => s.serialize_bytes(v),
336 }
337 }
338}
339
340#[cfg(feature = "serde")]
341struct ValueVisitor;
342
343#[cfg(feature = "serde")]
344impl<'de> Visitor<'de> for ValueVisitor {
345 type Value = Value<'de>;
346
347 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
348 formatter.write_str("a string, integer, sequence, map, or null value")
349 }
350
351 fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> {
352 Ok(Value::Empty)
353 }
354
355 fn visit_unit<E: de::Error>(self) -> Result<Self::Value, E> {
356 Ok(Value::Empty)
357 }
358
359 fn visit_i64<E: de::Error>(self, value: i64) -> Result<Self::Value, E> {
360 Ok(Value::Number(Number::Dec(value)))
361 }
362
363 fn visit_u64<E: de::Error>(self, value: u64) -> Result<Self::Value, E> {
364 Ok(Value::Number(Number::Dec(value as _)))
365 }
366
367 fn visit_str<E: de::Error>(self, value: &str) -> Result<Self::Value, E> {
368 if let Ok(n) = Number::from_str(value) {
369 Ok(Value::Number(n))
370 } else {
371 Ok(Value::from(value.to_string()))
372 }
373 }
374
375 fn visit_bytes<E: de::Error>(self, value: &[u8]) -> Result<Self::Value, E> {
376 Ok(Value::from(value.to_vec()))
377 }
378
379 fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
380 let mut v = vec![];
381 while let Some(elem) = seq.next_element()? {
382 v.push(elem);
383 }
384 Ok(Value::List(v))
385 }
386
387 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
388 let mut kv = vec![];
389 while let Some((k, v)) = map.next_entry::<Key, Value>()? {
390 kv.push((k, v));
391 }
392 Ok(Value::Map(kv))
393 }
394}
395
396#[cfg(feature = "serde")]
397impl<'de> Deserialize<'de> for Value<'de> {
398 #[inline(always)]
399 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
400 d.deserialize_any(ValueVisitor)
401 }
402}
403
404impl PartialEq<str> for Value<'_> {
405 fn eq(&self, other: &str) -> bool {
406 self == other.as_bytes()
407 }
408}
409
410impl PartialEq<[u8]> for Value<'_> {
411 fn eq(&self, other: &[u8]) -> bool {
412 match self {
413 Value::Empty => other.is_empty(),
414 Value::Str(r, _) => r == &other,
415 Value::Segments(segs) => {
416 let l = segs.iter().map(|s| s.len()).sum();
417 let mut buf: Vec<u8> = Vec::with_capacity(l);
418 for s in segs {
419 buf.extend(*s);
420 }
421 buf == other
422 }
423 Value::Literal(s) => s.as_bytes() == other,
424 Value::Owned(v) => v == other,
425 Value::List(_)
426 | Value::StringifiedList(_)
427 | Value::Map(_)
428 | Value::Skipped(_)
429 | Value::Number(_) => false,
430 }
431 }
432}
433
434impl<'a> From<&'a [u8]> for Value<'a> {
435 fn from(value: &'a [u8]) -> Self {
436 Value::Str(value, Quote::None)
437 }
438}
439
440impl<'a> From<&'a str> for Value<'a> {
441 fn from(value: &'a str) -> Self {
442 Self::from(value.as_bytes())
443 }
444}
445
446impl From<Vec<u8>> for Value<'_> {
447 fn from(value: Vec<u8>) -> Self {
448 Value::Owned(value)
449 }
450}
451
452impl From<String> for Value<'_> {
453 fn from(value: String) -> Self {
454 Self::from(Vec::from(value))
455 }
456}
457
458impl From<i64> for Value<'_> {
459 fn from(value: i64) -> Self {
460 Value::Number(Number::Dec(value))
461 }
462}