rmpv/ext/
mod.rs

1use std::error;
2use std::fmt::{self, Display, Formatter};
3
4use serde::de::Unexpected;
5
6use crate::{Integer, IntPriv, Value, ValueRef};
7
8pub use self::de::{deserialize_from, from_value, EnumRefDeserializer};
9pub use self::se::to_value;
10
11mod de;
12mod se;
13
14#[derive(Debug)]
15pub enum Error {
16    Syntax(String),
17}
18
19impl Display for Error {
20    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), fmt::Error> {
21        match *self {
22            Error::Syntax(ref err) => write!(fmt, "{}: {}", error::Error::description(self), err)
23        }
24    }
25}
26
27impl error::Error for Error {
28    fn description(&self) -> &str {
29        "error while decoding value"
30    }
31
32    fn cause(&self) -> Option<&dyn error::Error> {
33        match *self {
34            Error::Syntax(..) => None,
35        }
36    }
37}
38
39trait ValueExt {
40    fn unexpected(&self) -> Unexpected<'_>;
41}
42
43impl ValueExt for Value {
44    fn unexpected(&self) -> Unexpected<'_> {
45        match *self {
46            Value::Nil => Unexpected::Unit,
47            Value::Boolean(v) => Unexpected::Bool(v),
48            Value::Integer(Integer { n }) => {
49                match n {
50                    IntPriv::PosInt(v) => Unexpected::Unsigned(v),
51                    IntPriv::NegInt(v) => Unexpected::Signed(v),
52                }
53            }
54            Value::F32(v) => Unexpected::Float(v as f64),
55            Value::F64(v) => Unexpected::Float(v),
56            Value::String(ref v) => {
57                match v.s {
58                    Ok(ref v) => Unexpected::Str(v),
59                    Err(ref v) => Unexpected::Bytes(&v.0[..]),
60                }
61            }
62            Value::Binary(ref v) => Unexpected::Bytes(v),
63            Value::Array(..) => Unexpected::Seq,
64            Value::Map(..) => Unexpected::Map,
65            Value::Ext(..) => Unexpected::Seq,
66        }
67    }
68}
69
70impl<'a> ValueExt for ValueRef<'a> {
71    fn unexpected(&self) -> Unexpected<'_> {
72        match *self {
73            ValueRef::Nil => Unexpected::Unit,
74            ValueRef::Boolean(v) => Unexpected::Bool(v),
75            ValueRef::Integer(Integer { n }) => {
76                match n {
77                    IntPriv::PosInt(v) => Unexpected::Unsigned(v),
78                    IntPriv::NegInt(v) => Unexpected::Signed(v),
79                }
80            }
81            ValueRef::F32(v) => Unexpected::Float(v as f64),
82            ValueRef::F64(v) => Unexpected::Float(v),
83            ValueRef::String(ref v) => {
84                match v.s {
85                    Ok(ref v) => Unexpected::Str(v),
86                    Err(ref v) => Unexpected::Bytes(&v.0[..]),
87                }
88            }
89            ValueRef::Binary(ref v) => Unexpected::Bytes(v),
90            ValueRef::Array(..) => Unexpected::Seq,
91            ValueRef::Map(..) => Unexpected::Map,
92            ValueRef::Ext(..) => Unexpected::Seq,
93        }
94    }
95}