1use csv;
2use glob;
3use protobuf;
4use rmpv;
5use serde_cbor;
6use serde_hjson;
7use serde_json;
8use serde_protobuf;
9use serde_yaml;
10use std::io;
11use std::string;
12use toml;
13#[cfg(feature = "v8")]
14use v8;
15use yaml_rust;
16
17use std::result;
18
19pub type Result<A> = result::Result<A, Error>;
20
21#[derive(Debug, Fail)]
22pub enum Error {
23 #[fail(display = "protobuf error")]
24 Protobuf(#[cause] serde_protobuf::error::Error),
25 #[fail(display = "IO error")]
26 Io(#[cause] io::Error),
27 #[fail(display = "UTF-8 error")]
28 Utf8(#[cause] string::FromUtf8Error),
29 #[fail(display = "native protobuf error")]
30 NativeProtobuf(#[cause] protobuf::ProtobufError),
31 #[fail(display = "MessagePack encode error")]
32 MessagePackEncode(#[cause] rmpv::encode::Error),
33 #[fail(display = "Avro error")]
34 Avro(#[cause] Avro),
35 #[fail(display = "CBOR error")]
36 Cbor(#[cause] serde_cbor::error::Error),
37 #[fail(display = "HJSON error")]
38 Hjson(#[cause] serde_hjson::Error),
39 #[fail(display = "JSON error")]
40 Json(#[cause] serde_json::Error),
41 #[fail(display = "YAML error")]
42 Yaml(#[cause] serde_yaml::Error),
43 #[fail(display = "YAML scan error")]
44 YamlScan(#[cause] yaml_rust::ScanError),
45 #[fail(display = "TOML deserialize error")]
46 TomlDeserialize(#[cause] toml::de::Error),
47 #[fail(display = "TOML serialize error")]
48 TomlSerialize(#[cause] toml::ser::Error),
49 #[fail(display = "glob error")]
50 Glob(#[cause] glob::GlobError),
51 #[fail(display = "glob pattern error")]
52 GlobPattern(#[cause] glob::PatternError),
53 #[fail(display = "CSV error")]
54 Csv(#[cause] csv::Error),
55 #[fail(display = "MessagePack decode error")]
56 MessagePackDecode(#[cause] rmpv::decode::Error),
57 #[fail(display = "unimplemented: {}", msg)]
58 Unimplemented { msg: String },
59 #[fail(display = "illegal state: {}", msg)]
60 IllegalState { msg: String },
61 #[fail(display = "format error: {}", msg)]
62 Format { msg: String },
63 #[fail(display = "internal error: {}", _0)]
64 Internal(&'static str),
65 #[fail(display = "{}", _0)]
66 Message(String),
67}
68
69#[derive(Debug, Fail)]
70pub enum Avro {
71 #[fail(display = "decode error")]
72 Decode(#[cause] avro_rs::DecodeError),
73 #[fail(display = "error when parsing schema")]
74 ParseSchema(#[cause] avro_rs::ParseSchemaError),
75 #[fail(display = "schema resolution error")]
76 SchemaResolution(#[cause] avro_rs::SchemaResolutionError),
77 #[fail(display = "validation error")]
78 Validation(#[cause] avro_rs::ValidationError),
79 #[fail(display = "{}", message)]
80 Custom { message: String },
81}
82
83impl Error {
84 pub fn unimplemented(msg: String) -> Self {
85 Self::Unimplemented { msg }
86 }
87
88 pub fn illegal_state(msg: String) -> Self {
89 Self::IllegalState { msg }
90 }
91}
92
93impl Avro {
94 pub fn downcast(error: failure::Error) -> Self {
95 let error = match error.downcast::<avro_rs::DecodeError>() {
96 Ok(error) => return Self::Decode(error),
97 Err(error) => error,
98 };
99
100 let error = match error.downcast::<avro_rs::ParseSchemaError>() {
101 Ok(error) => return Self::ParseSchema(error),
102 Err(error) => error,
103 };
104
105 let error = match error.downcast::<avro_rs::SchemaResolutionError>() {
106 Ok(error) => return Self::SchemaResolution(error),
107 Err(error) => error,
108 };
109
110 let error = match error.downcast::<avro_rs::ValidationError>() {
111 Ok(error) => return Self::Validation(error),
112 Err(error) => error,
113 };
114
115 Self::Custom {
116 message: error.to_string(),
117 }
118 }
119}
120
121macro_rules! gen_from {
122 ($t:ty, $i:ident) => {
123 impl From<$t> for Error {
124 fn from(e: $t) -> Self {
125 Self::$i(e)
126 }
127 }
128 };
129}
130
131gen_from!(serde_protobuf::error::Error, Protobuf);
132gen_from!(io::Error, Io);
133#[cfg(feature = "js")]
134gen_from!(v8::error::Error, Js);
135gen_from!(string::FromUtf8Error, Utf8);
136gen_from!(protobuf::ProtobufError, NativeProtobuf);
137gen_from!(rmpv::encode::Error, MessagePackEncode);
138gen_from!(serde_cbor::error::Error, Cbor);
139gen_from!(serde_hjson::Error, Hjson);
140gen_from!(serde_json::Error, Json);
141gen_from!(serde_yaml::Error, Yaml);
142gen_from!(yaml_rust::ScanError, YamlScan);
143gen_from!(toml::de::Error, TomlDeserialize);
144gen_from!(toml::ser::Error, TomlSerialize);
145gen_from!(glob::GlobError, Glob);
146gen_from!(glob::PatternError, GlobPattern);
147gen_from!(csv::Error, Csv);
148gen_from!(rmpv::decode::Error, MessagePackDecode);