1use std::io;
3use futures::sync::oneshot::Canceled;
4use crate::pdu::MessageEncoding;
5use crate::at;
6use failure::Fail;
7
8#[derive(Fail, Debug)]
10pub enum CommandError<T> where T: Fail {
11 #[fail(display = "Error in command: {}", _0)]
13 Command(#[cause] T),
14 #[fail(display = "{}", _0)]
16 Huawei(#[cause] HuaweiError)
17}
18impl<T> From<HuaweiError> for CommandError<T> where T: Fail {
19 fn from(e: HuaweiError) -> CommandError<T> {
20 CommandError::Huawei(e)
21 }
22}
23#[derive(Fail, Debug)]
27pub enum HuaweiError {
28 #[fail(display = "Failed to communicate with the background future (it's likely dead).")]
31 FutureDied,
32 #[fail(display = "Error from modem: {}", _0)]
34 AtError(#[cause] at::AtResultCode),
35 #[fail(display = "An I/O error occurred: {}", _0)]
37 IoError(#[cause] io::Error),
38 #[fail(display = "There was an error parsing data.")]
40 ParseError(::nom::ErrorKind),
41 #[fail(display = "Expected a {} response", _0)]
44 ExpectedResponse(String),
45 #[fail(display = "Type mismatch when parsing reply")]
47 TypeMismatch,
48 #[fail(display = "Value out of range: {}", _0)]
50 ValueOutOfRange(at::AtValue),
51 #[fail(display = "Invalid PDU: {}", _0)]
53 InvalidPdu(&'static str),
54 #[fail(display = "Data of unknown encoding {:?}: {:?}", _0, _1)]
56 UnsupportedEncoding(MessageEncoding, Vec<u8>),
57 #[fail(display = "[this should never be shown]")]
60 #[doc(hidden)]
61 __Nonexhaustive
62}
63impl From<io::Error> for HuaweiError {
64 fn from(e: io::Error) -> HuaweiError {
65 HuaweiError::IoError(e)
66 }
67}
68impl From<::nom::ErrorKind> for HuaweiError {
69 fn from(e: ::nom::ErrorKind) -> HuaweiError {
70 HuaweiError::ParseError(e)
71 }
72}
73impl From<Canceled> for HuaweiError {
74 fn from(_: Canceled) -> HuaweiError {
75 HuaweiError::FutureDied
76 }
77}
78pub type HuaweiResult<T> = Result<T, HuaweiError>;