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
//! Errors raised during serialization/deserialization.
use serde::{de, ser};
use std::{error, fmt, result};

/// Errors that can occur during serialization and deserialization of a
/// [Key](crate::Key).
#[derive(Debug, PartialEq)]
pub enum Error {
    /// Unexpected type encountered.
    Unexpected(&'static str),
    /// Type is not supported for serialization.
    UnsupportedType(&'static str),
    /// Unsupported deserialization variant.
    UnexpectedVariant(&'static str),
    /// A custom error.
    Custom(String),
    /// Value is missing during deserialization.
    MissingValue,
    /// Array has invalid length.
    InvalidLength,
}

/// Helper alias for a Result which already represents our local [Error] type.
pub type Result<T, E = Error> = result::Result<T, E>;

impl fmt::Display for Error {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        use self::Error::*;

        match self {
            Unexpected(expected) => write!(fmt, "unexpected type, expected: {}", expected),
            UnsupportedType(ty) => write!(fmt, "unsupported type: {}", ty),
            UnexpectedVariant(variant) => write!(fmt, "unexpectec variant: {}", variant),
            Custom(e) => write!(fmt, "{}", e),
            MissingValue => write!(fmt, "missing value duration deserialization"),
            InvalidLength => write!(fmt, "array with invalid length"),
        }
    }
}

impl error::Error for Error {}

impl ser::Error for Error {
    fn custom<T>(msg: T) -> Self
    where
        T: fmt::Display,
    {
        Error::Custom(msg.to_string())
    }
}

impl de::Error for Error {
    fn custom<T>(msg: T) -> Self
    where
        T: fmt::Display,
    {
        Error::Custom(msg.to_string())
    }
}