scatterbrain/api/
error.rs1use 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}