1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
//! Error type for the client module.
use crate::client::SyncError;
use http::StatusCode;
use serde_json::Value;
#[cfg(feature = "client")]
use sos_sdk::sync::Origin;
use std::path::PathBuf;
use thiserror::Error;
/// Errors generated by the client module.
#[derive(Debug, Error)]
pub enum Error {
/// Error generated when a path is not a directory.
#[error("path {0} is not a directory")]
NotDirectory(PathBuf),
/// Error generated when a path is not a file.
#[error("path {0} is not a file")]
NotFile(PathBuf),
/// Error generated when a file already exists.
#[error("file {0} already exists")]
FileExists(PathBuf),
/// Error generated when a single sync error is expected.
#[error("single sync error expected")]
SyncErrorOne,
/// Error generated when an unexpected response code is received.
#[error("unexpected response status code {0}")]
ResponseCode(StatusCode),
/// Error generated when an unexpected response code is received.
#[error("unexpected response {1} (code: {0})")]
ResponseJson(StatusCode, Value),
/// Error generated when a return value is expected from a RPC call
/// but the response did not have a result.
#[error("method did not return a value")]
NoReturnValue,
/// Error generated when a remote origin could not be found.
#[error("origin '{0}' not found")]
OriginNotFound(Origin),
/// Error generated when a websocket message is not binary.
#[error("not binary message type on websocket")]
NotBinaryWebsocketMessageType,
/// Error generated when failing to fetch account from a remote
/// during device enrollment.
#[error("could not fetch account from remote '{0}'")]
EnrollFetch(String),
/// Error generated attempting to enroll a new device and
/// the account already exists on the device.
#[error("cannot enroll, account '{0}' already exists on this device")]
EnrollAccountExists(String),
/// Error generated when failing to sync after completing
/// device enrollment.
#[error("could not sync to '{0}' after device enrollment")]
EnrollSync(String),
/// Error generated when failing to sync after revoking a device.
#[error("failed to sync after revoking device")]
RevokeDeviceSync,
/// Error generated when a downloaded file checksum does not
/// match the expected checksum.
#[error("file download checksum mismatch; expected '{0}' but got '{1}'")]
FileChecksumMismatch(String, String),
/// Generic boxed error.
#[error(transparent)]
Boxed(#[from] Box<dyn std::error::Error + Send + Sync>),
/// Error generated by the main net library.
#[error(transparent)]
Net(#[from] crate::Error),
/// Error generated parsing to an integer.
#[error(transparent)]
ParseInt(#[from] std::num::ParseIntError),
/// Error generated converting a header to a string.
#[error(transparent)]
ToStr(#[from] reqwest::header::ToStrError),
/// Error generated by the io module.
#[error(transparent)]
Io(#[from] std::io::Error),
/// Error generated by the JSON library.
#[error(transparent)]
Json(#[from] serde_json::Error),
/// Error generated attempting to convert from a slice.
#[error(transparent)]
TryFromSlice(#[from] std::array::TryFromSliceError),
/// Error generated by the core library.
#[error(transparent)]
Core(#[from] sos_sdk::Error),
/// Error generated by the HTTP request library.
#[error(transparent)]
Http(#[from] reqwest::Error),
/// Error generated attempting to parse a URL.
#[error(transparent)]
UrlParse(#[from] url::ParseError),
/// Error generated attempting to convert to a UTF-8 string.
#[error(transparent)]
Utf8(#[from] std::str::Utf8Error),
/// Error generated decoding a base58 string.
#[error(transparent)]
Base58Decode(#[from] bs58::decode::Error),
/// Error generated converting an HTTP status code.
#[error(transparent)]
HttpStatus(#[from] http::status::InvalidStatusCode),
/// Error generated by the websocket client.
#[cfg(feature = "listen")]
#[error(transparent)]
WebSocket(#[from] tokio_tungstenite::tungstenite::Error),
/// Error generated when converting to a UUID.
#[error(transparent)]
Uuid(#[from] uuid::Error),
/// Error generated when parsing from hex.
#[error(transparent)]
Hex(#[from] hex::FromHexError),
/// Error generated by the migrate library.
#[error(transparent)]
#[cfg(feature = "migrate")]
Migrate(#[from] sos_sdk::migrate::Error),
}
impl From<SyncError> for Error {
fn from(value: SyncError) -> Self {
match value {
SyncError::One(e) => e,
_ => unreachable!(),
}
}
}