serde_pod/
error.rs

1//! Содержит тип ошибки и результата, описывающие неуспешный результат сериализации
2//! или десериализации.
3use std::error;
4use std::fmt;
5use std::io;
6use std::result;
7use std::str::Utf8Error;
8use std::string::FromUtf8Error;
9use serde::{de, ser};
10
11/// Варианты ошибок, которые могут возникнуть при сериализации или десериализации
12#[derive(Debug)]
13pub enum Error {
14  /// Ошибка при записи сформированных байт в поток во время сериализации или при
15  /// чтении из потока во время десериализации.
16  Io(io::Error),
17  /// Ошибка декодирования строки или символа из массива байт
18  Encoding(Utf8Error),
19  /// Ошибка сериализации стороннего типа
20  Unknown(String),
21  /// Метод десериализации не поддерживается
22  Unsupported(&'static str),
23}
24/// Результат операции сериализации или десериализации
25pub type Result<T> = result::Result<T, Error>;
26
27impl fmt::Display for Error {
28  fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
29    match *self {
30      Error::Io(ref err) => err.fmt(fmt),
31      Error::Encoding(ref err) => err.fmt(fmt),
32      Error::Unknown(ref msg) => msg.fmt(fmt),
33      Error::Unsupported(ref msg) => msg.fmt(fmt),
34    }
35  }
36}
37
38impl error::Error for Error {
39  fn source(&self) -> Option<&(dyn error::Error + 'static)> {
40    match *self {
41      Error::Io(ref err) => Some(err),
42      Error::Encoding(ref err) => Some(err),
43      Error::Unknown(_) => None,
44      Error::Unsupported(_) => None,
45    }
46  }
47}
48// Конвертация из ошибок сериализации сторонних типов
49impl ser::Error for Error {
50  fn custom<T: fmt::Display>(msg: T) -> Self {
51    Error::Unknown(msg.to_string())
52  }
53}
54// Конвертация из ошибок десериализации сторонних типов
55impl de::Error for Error {
56  fn custom<T: fmt::Display>(msg: T) -> Self {
57    Error::Unknown(msg.to_string())
58  }
59}
60// Конвертация из ошибок, связанных с чтением/записью из потока
61impl From<io::Error> for Error {
62  fn from(err: io::Error) -> Self {
63    Error::Io(err)
64  }
65}
66// Конвертация из ошибок, связанных с кодированием строк в UTF-8
67impl From<Utf8Error> for Error {
68  fn from(err: Utf8Error) -> Self {
69    Error::Encoding(err)
70  }
71}
72impl From<FromUtf8Error> for Error {
73  fn from(err: FromUtf8Error) -> Self {
74    Error::Encoding(err.utf8_error())
75  }
76}