Skip to content

Commit b70fb26

Browse files
committed
Turn KeyDecodingError enum into struct with source err as trait object
Signed-off-by: Patrik Stas <[email protected]>
1 parent cbb6fef commit b70fb26

File tree

3 files changed

+88
-43
lines changed

3 files changed

+88
-43
lines changed

did_core/did_doc/src/schema/types/jsonwebkey.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use std::{
22
collections::HashMap,
3+
error::Error,
34
fmt::{self, Display, Formatter},
45
str::FromStr,
56
};
6-
use std::error::Error;
77

88
use serde::{Deserialize, Serialize};
99
use serde_json::Value;
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,92 @@
1+
use std::{
2+
error::Error,
3+
fmt,
4+
fmt::{Display, Formatter},
5+
};
6+
17
use thiserror::Error;
2-
use crate::schema::types::jsonwebkey::JsonWebKeyError;
38

4-
use crate::schema::types::multibase::MultibaseWrapperError;
9+
use crate::schema::types::{jsonwebkey::JsonWebKeyError, multibase::MultibaseWrapperError};
510

611
#[derive(Debug, Error)]
7-
pub enum KeyDecodingError {
8-
#[error("Json decoding error: ${0}")]
9-
JsonError(serde_json::Error),
10-
#[error("Pem decoding error: ${0}")]
11-
PemError(pem::PemError),
12-
#[error("Unsupported key error: ${0}")]
13-
UnsupportedPublicKeyField(&'static str),
14-
#[error("Base 58 decoding error: ${0}")]
15-
Base58DecodeError(bs58::decode::Error),
16-
#[error("Base 64 decoding error: ${0}")]
17-
Base64DecodeError(base64::DecodeError),
18-
#[error("Hex decoding error: ${0}")]
19-
HexDecodeError(hex::FromHexError),
20-
#[error("Jwk decoding error: ${0}")]
21-
JwkDecodeError(JsonWebKeyError),
22-
#[error("Multibase decoding error ${0}")]
23-
MultibaseError(MultibaseWrapperError),
12+
pub struct KeyDecodingError {
13+
reason: &'static str,
14+
#[source]
15+
source: Option<Box<dyn Error + Sync + Send>>,
16+
}
17+
18+
impl KeyDecodingError {
19+
pub fn new(reason: &'static str) -> Self {
20+
KeyDecodingError {
21+
reason,
22+
source: None,
23+
}
24+
}
25+
}
26+
27+
impl Display for KeyDecodingError {
28+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
29+
match &self.source {
30+
Some(source) => write!(
31+
f,
32+
"KeyDecodingError, reason: {}, source: {}",
33+
self.reason, source
34+
),
35+
None => write!(f, "KeyDecodingError, reason: {}", self.reason),
36+
}
37+
}
2438
}
2539

2640
impl From<pem::PemError> for KeyDecodingError {
2741
fn from(error: pem::PemError) -> Self {
28-
KeyDecodingError::PemError(error)
42+
KeyDecodingError {
43+
reason: "Failed to decode PEM",
44+
source: Some(Box::new(error)),
45+
}
2946
}
3047
}
3148

3249
impl From<bs58::decode::Error> for KeyDecodingError {
3350
fn from(error: bs58::decode::Error) -> Self {
34-
KeyDecodingError::Base58DecodeError(error)
51+
KeyDecodingError {
52+
reason: "Failed to decode base58",
53+
source: Some(Box::new(error)),
54+
}
3555
}
3656
}
3757

3858
impl From<base64::DecodeError> for KeyDecodingError {
3959
fn from(error: base64::DecodeError) -> Self {
40-
KeyDecodingError::Base64DecodeError(error)
60+
KeyDecodingError {
61+
reason: "Failed to decode base64",
62+
source: Some(Box::new(error)),
63+
}
4164
}
4265
}
4366

4467
impl From<hex::FromHexError> for KeyDecodingError {
4568
fn from(error: hex::FromHexError) -> Self {
46-
KeyDecodingError::HexDecodeError(error)
69+
KeyDecodingError {
70+
reason: "Failed to decode hex value",
71+
source: Some(Box::new(error)),
72+
}
73+
}
74+
}
75+
76+
impl From<MultibaseWrapperError> for KeyDecodingError {
77+
fn from(error: MultibaseWrapperError) -> Self {
78+
KeyDecodingError {
79+
reason: "Failed to decode multibase value",
80+
source: Some(Box::new(error)),
81+
}
82+
}
83+
}
84+
85+
impl From<JsonWebKeyError> for KeyDecodingError {
86+
fn from(error: JsonWebKeyError) -> Self {
87+
KeyDecodingError {
88+
reason: "Failed to decode JWK",
89+
source: Some(Box::new(error)),
90+
}
4791
}
4892
}

did_core/did_doc/src/schema/verification_method/public_key.rs

+20-19
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,10 @@ impl PublicKeyField {
3434
PublicKeyField::Multibase {
3535
public_key_multibase,
3636
} => {
37-
let multibase = Multibase::from_str(public_key_multibase)
38-
.map_err(KeyDecodingError::MultibaseError)?;
37+
let multibase = Multibase::from_str(public_key_multibase)?;
3938
Ok(multibase.as_ref().to_vec())
4039
}
41-
PublicKeyField::Jwk { public_key_jwk } => Ok(public_key_jwk
42-
.to_vec()
43-
.map_err(KeyDecodingError::JwkDecodeError)?),
40+
PublicKeyField::Jwk { public_key_jwk } => Ok(public_key_jwk.to_vec()?),
4441
PublicKeyField::Base58 { public_key_base58 } => {
4542
Ok(bs58::decode(public_key_base58).into_vec()?)
4643
}
@@ -51,9 +48,9 @@ impl PublicKeyField {
5148
PublicKeyField::Pem { public_key_pem } => {
5249
Ok(pem::parse(public_key_pem.as_bytes())?.contents().to_vec())
5350
}
54-
PublicKeyField::Pgp { public_key_pgp: _ } => {
55-
Err(KeyDecodingError::UnsupportedPublicKeyField("publicKeyPgp"))
56-
}
51+
PublicKeyField::Pgp { public_key_pgp: _ } => Err(KeyDecodingError::new(
52+
"PGP public key decoding not supported",
53+
)),
5754
}
5855
}
5956

@@ -65,6 +62,8 @@ impl PublicKeyField {
6562

6663
#[cfg(test)]
6764
mod tests {
65+
use std::error::Error;
66+
6867
use super::*;
6968

7069
static PUBLIC_KEY_MULTIBASE: &str = "z6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc";
@@ -124,12 +123,13 @@ mod tests {
124123
let public_key_field = PublicKeyField::Base58 {
125124
public_key_base58: "abcdefghijkl".to_string(),
126125
};
127-
let err = public_key_field.key_decoded().unwrap_err();
128-
assert!(
129-
matches!(err, KeyDecodingError::Base58DecodeError(_)),
130-
"Expected Base58DecodeError, got {:?}",
131-
err
132-
);
126+
let err = public_key_field.key_decoded().expect_err("Expected error");
127+
println!("Error: {}", err);
128+
assert!(err
129+
.source()
130+
.expect("Error was expected to has source set up.")
131+
.is::<bs58::decode::Error>());
132+
assert!(err.to_string().contains("Failed to decode base58"));
133133
}
134134

135135
#[test]
@@ -138,10 +138,11 @@ mod tests {
138138
public_key_pem: "abcdefghijkl".to_string(),
139139
};
140140
let err = public_key_field.key_decoded().unwrap_err();
141-
assert!(
142-
matches!(err, KeyDecodingError::PemError(_)),
143-
"Expected PemError, got {:?}",
144-
err
145-
);
141+
println!("Error: {}", err);
142+
assert!(err
143+
.source()
144+
.expect("Error was expected to has source set up.")
145+
.is::<pem::PemError>());
146+
assert!(err.to_string().contains("Failed to decode PEM"));
146147
}
147148
}

0 commit comments

Comments
 (0)