Skip to main content

scatterbrain/api/
error.rs

1use std::array::TryFromSliceError;
2
3use crate::api::proto::{unit_response::UnitresponseMaybeMessage, RespCode, UnitResponse};
4
5pub type SbResult<T> = std::result::Result<T, Error>;
6
7#[derive(Debug, thiserror::Error)]
8pub enum Error {
9    #[error("Mdns error: {0}")]
10    MdnsError(#[from] mdns_sd::Error),
11    #[error("Protobuf decode error: {0}")]
12    ProtoDecode(#[from] prost::DecodeError),
13    #[error("Protobuf encode error: {0}")]
14    ProtoEncode(#[from] prost::EncodeError),
15    #[error("Unknown enum varient: {0}")]
16    ProtoUnknownEnum(#[from] prost::UnknownEnumValue),
17    #[error("IO error {0}")]
18    IoError(#[from] std::io::Error),
19    #[error("Message size error: {0}")]
20    MessageSizeError(usize),
21    #[error("CRC Mismatch")]
22    CrcMismatch,
23    #[error("Message type mismatch expected {expected} got {actual}")]
24    TypeMismatch { expected: String, actual: String },
25    #[error("crypto error: {0}")]
26    Crypto(String),
27    #[error("Buf length mismatch")]
28    BufLengthError(#[from] TryFromSliceError),
29    #[error("No addresses remaining")]
30    NoAddr,
31    #[error("Pairing failed")]
32    PairingFailed,
33    #[error("Coinscam error: {0}")]
34    CoinError(#[from] bip39::Error),
35    #[error("Possible mitm detected!")]
36    MitmDetected,
37    #[error("Corrupt header")]
38    CorruptHeader,
39    #[error("{0}")]
40    RemoteError(String),
41    #[error("{0}")]
42    JsonError(#[from] serde_json::Error),
43    #[error("{0}")]
44    CryptoError(#[from] dryoc::Error),
45    #[error("{0}")]
46    Generic(#[from] Box<dyn std::error::Error + Send + Sync>),
47}
48
49pub trait IntoRemoteErr {
50    fn into_remote_err(self) -> SbResult<()>;
51}
52
53impl IntoRemoteErr for UnitResponse {
54    fn into_remote_err(self) -> SbResult<()> {
55        if self.code() != RespCode::Ok {
56            Err(self
57                .unitresponse_maybe_message
58                .map(|v| {
59                    let UnitresponseMaybeMessage::MessageCode(v) = v;
60                    Error::RemoteError(v)
61                })
62                .unwrap_or_else(|| Error::RemoteError("".to_owned())))
63        } else {
64            Ok(())
65        }
66    }
67}