From 81467b27d1c949ea84ae473ab625e659d94e6150 Mon Sep 17 00:00:00 2001 From: adria0 Date: Sat, 20 Jun 2020 21:22:19 +0200 Subject: [PATCH] Use thiserror --- Cargo.toml | 1 + examples/.ssb-cli.rs.swp | Bin 24576 -> 0 bytes examples/ssb-cli.rs | 41 ++++++++++++++------------ src/api/error.rs | 62 +++++---------------------------------- src/crypto/error.rs | 24 +++++++-------- src/discovery/error.rs | 40 +++++++------------------ src/feed/error.rs | 56 +++++++++++++---------------------- src/keystore/error.rs | 39 +++++++----------------- src/lib.rs | 1 + src/rpc/error.rs | 31 ++++++-------------- 10 files changed, 93 insertions(+), 202 deletions(-) delete mode 100644 examples/.ssb-cli.rs.swp diff --git a/Cargo.toml b/Cargo.toml index 0eb1f0d..4d95072 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ get_if_addrs = "0.5.3" regex = "1.3.7" once_cell = "1.3.1" async-stream = "0.2.1" +thiserror = "1.0.20" [[example]] name = "ssb-cli" diff --git a/examples/.ssb-cli.rs.swp b/examples/.ssb-cli.rs.swp deleted file mode 100644 index 89bddf96024c6511fcd1cf02313475fb4ef3d837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 { return std::result::Result::Err(Box::new(AppError::new(message))); } - _ => { } + _ => {} } } } @@ -119,7 +119,7 @@ where return std::result::Result::Err(Box::new(AppError::new(message))); } RecvMsg::CancelStreamRespose() => break, - _ => { } + _ => {} } } } @@ -189,34 +189,37 @@ async fn main() -> SolarResult<()> { let req_id = client.whoami_req_send().await?; let whoami = match get_async(&mut rpc_reader, req_id, whoami_res_parse).await { - Ok(res) => { - println!("😊 server says hello to {}", res.id); - id - } - Err(err) => { - if !err.to_string().contains("method:whoami is not in list of allowed methods") { - println!("Cannot ask for whoami {}",err); - } - id - } + Ok(res) => { + println!("😊 server says hello to {}", res.id); + id + } + Err(err) => { + if !err + .to_string() + .contains("method:whoami is not in list of allowed methods") + { + println!("Cannot ask for whoami {}", err); + } + id + } }; - loop { - let mut line_buffer = String::new(); - print!("> "); std::io::stdout().flush(); + let mut line_buffer = String::new(); + print!("> "); + let _ = std::io::stdout().flush(); match std::io::stdin().read_line(&mut line_buffer) { - Err(_) => break, - _ => { } + Err(_) => break, + _ => {} }; let args: Vec = line_buffer .replace("\n", "") .split_whitespace() .map(|arg| arg.to_string()) .collect(); - + if args.len() == 0 { - continue; + continue; } match (args[0].as_str(), args.len()) { ("exit", 1) => { diff --git a/src/api/error.rs b/src/api/error.rs index ddd9309..d2684f5 100644 --- a/src/api/error.rs +++ b/src/api/error.rs @@ -1,59 +1,11 @@ -#[derive(Debug)] +use thiserror::Error; + +#[derive(Error, Debug)] pub enum Error { - InvalidSequenceNo, - ServerMessage(String), - Rpc(crate::rpc::Error), - InvalidInviteCode, - HomeNotFound, - InvalidConfig, - Json(serde_json::Error), - ParseInt(std::num::ParseIntError), - CryptoFormat(crate::crypto::Error), - Io(std::io::Error), - Feed(crate::feed::Error), + #[error("rpc")] + Rpc(#[from] crate::rpc::Error), + #[error("json decode")] + Json(#[from] serde_json::Error), } -impl From for Error { - fn from(err: crate::rpc::Error) -> Self { - Error::Rpc(err) - } -} - -impl From for Error { - fn from(err: serde_json::Error) -> Self { - Error::Json(err) - } -} - -impl From for Error { - fn from(err: std::num::ParseIntError) -> Self { - Error::ParseInt(err) - } -} - -impl From for Error { - fn from(err: crate::crypto::Error) -> Self { - Error::CryptoFormat(err) - } -} - -impl From for Error { - fn from(err: std::io::Error) -> Self { - Error::Io(err) - } -} - -impl From for Error { - fn from(err: crate::feed::Error) -> Self { - Error::Feed(err) - } -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} -impl std::error::Error for Error {} - pub type Result = std::result::Result; diff --git a/src/crypto/error.rs b/src/crypto/error.rs index 25fe8b1..78263b3 100644 --- a/src/crypto/error.rs +++ b/src/crypto/error.rs @@ -1,23 +1,19 @@ -#[derive(Debug)] +use thiserror::Error; + +#[derive(Error, Debug)] pub enum Error { - Base64Decode(base64::DecodeError), + #[error("error decoding base64")] + Base64Decode(#[from] base64::DecodeError), + #[error("bad public key")] BadPublicKey, + #[error("bad secret key")] BadSecretKey, + #[error("invalid digest")] InvalidDigest, + #[error("invalid suffix")] InvalidSuffix, + #[error("cannot create signature")] CannotCreateSignature, } -impl From for Error { - fn from(err: base64::DecodeError) -> Self { - Error::Base64Decode(err) - } -} -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} -impl std::error::Error for Error {} - pub type Result = std::result::Result; diff --git a/src/discovery/error.rs b/src/discovery/error.rs index 12b7d1f..488bed8 100644 --- a/src/discovery/error.rs +++ b/src/discovery/error.rs @@ -1,35 +1,17 @@ -#[derive(Debug)] +use thiserror::Error; + +#[derive(Error, Debug)] pub enum Error { - ParseInt(std::num::ParseIntError), + #[error("invalid integer")] + ParseInt(#[from] std::num::ParseIntError), + #[error("invalid invite code")] InvalidInviteCode, + #[error("invalid broadcast message")] InvalidBroadcastMessage, - CryptoFormat(crate::crypto::Error), - Io(std::io::Error), + #[error("invalid crypto format")] + CryptoFormat(#[from] crate::crypto::Error), + #[error("i/o")] + Io(#[from] std::io::Error), } -impl From for Error { - fn from(err: crate::crypto::Error) -> Self { - Error::CryptoFormat(err) - } -} - -impl From for Error { - fn from(err: std::num::ParseIntError) -> Self { - Error::ParseInt(err) - } -} - -impl From for Error { - fn from(err: std::io::Error) -> Self { - Error::Io(err) - } -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} -impl std::error::Error for Error {} - pub type Result = std::result::Result; diff --git a/src/feed/error.rs b/src/feed/error.rs index e7f9af4..aed9ec5 100644 --- a/src/feed/error.rs +++ b/src/feed/error.rs @@ -1,49 +1,35 @@ -#[derive(Debug)] +use thiserror::Error; + +#[derive(Error, Debug)] pub enum Error { - Base64Decode(base64::DecodeError), + #[error("base64 decoding")] + Base64Decode(#[from] base64::DecodeError), + #[error("feed digest mismatch")] FeedDigestMismatch, - SystemTimeError(std::time::SystemTimeError), + #[error("time error")] + SystemTimeError(#[from] std::time::SystemTimeError), + #[error("invalid json")] InvalidJson, + #[error("invalid signature")] InvalidSignature, + #[error("failed to decipher")] FailedToDecipher, + #[error("cannot create key")] CannotCreateKey, + #[error("cannot read nonce")] CannotReadNonce, + #[error("crypto scalar mult failed")] CryptoScalarMultFailed, + #[error("empty plaintext")] EmptyPlaintext, + #[error("bad recipent")] BadRecipientCount, + #[error("invalid key from group")] CryptoKeyFromGrupFailed, - CryptoFormat(crate::crypto::Error), - Json(serde_json::Error), + #[error("invalid key format")] + CryptoFormat(#[from] crate::crypto::Error), + #[error("invalid json")] + Json(#[from] serde_json::Error), } -impl From for Error { - fn from(err: base64::DecodeError) -> Self { - Error::Base64Decode(err) - } -} -impl From for Error { - fn from(err: crate::crypto::Error) -> Self { - Error::CryptoFormat(err) - } -} - -impl From for Error { - fn from(err: std::time::SystemTimeError) -> Self { - Error::SystemTimeError(err) - } -} - -impl From for Error { - fn from(err: serde_json::Error) -> Self { - Error::Json(err) - } -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} -impl std::error::Error for Error {} - pub type Result = std::result::Result; diff --git a/src/keystore/error.rs b/src/keystore/error.rs index 4566904..4867c19 100644 --- a/src/keystore/error.rs +++ b/src/keystore/error.rs @@ -1,34 +1,17 @@ -#[derive(Debug)] +use thiserror::Error; + +#[derive(Error, Debug)] pub enum Error { + #[error("$HOME not found")] HomeNotFound, + #[error("invalid configuration file")] InvalidConfig, - Serde(serde_json::Error), - CryptoFormat(crate::crypto::Error), - SyncIo(std::io::Error), + #[error("json deserialization")] + Serde(#[from] serde_json::Error), + #[error("crypto format")] + CryptoFormat(#[from] crate::crypto::Error), + #[error("i/o")] + SyncIo(#[from] std::io::Error), } -impl From for Error { - fn from(err: crate::crypto::Error) -> Self { - Error::CryptoFormat(err) - } -} - -impl From for Error { - fn from(err: std::io::Error) -> Self { - Error::SyncIo(err) - } -} - -impl From for Error { - fn from(err: serde_json::Error) -> Self { - Error::Serde(err) - } -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} -impl std::error::Error for Error {} pub type Result = std::result::Result; diff --git a/src/lib.rs b/src/lib.rs index 7948eb5..a6764a4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ pub extern crate kuska_handshake as handshake; extern crate serde; extern crate async_std; extern crate serde_json; +extern crate thiserror; pub mod api; pub mod crypto; diff --git a/src/rpc/error.rs b/src/rpc/error.rs index 9148f1e..7dd3f59 100644 --- a/src/rpc/error.rs +++ b/src/rpc/error.rs @@ -1,28 +1,15 @@ -#[derive(Debug)] +use thiserror::Error; + +#[derive(Error, Debug)] pub enum Error { + #[error("header size too small")] HeaderSizeTooSmall, + #[error("invalid body type: {0}")] InvalidBodyType(u8), - Io(async_std::io::Error), - Json(serde_json::Error), + #[error("i/o")] + Io(#[from] async_std::io::Error), + #[error("json decoding")] + Json(#[from] serde_json::Error), } -impl From for Error { - fn from(err: async_std::io::Error) -> Self { - Error::Io(err) - } -} - -impl From for Error { - fn from(err: serde_json::Error) -> Self { - Error::Json(err) - } -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} -impl std::error::Error for Error {} - pub type Result = std::result::Result;