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}