Skip to content

Commit 4c53801

Browse files
committed
New error type. Now with 99% less enum cases
1 parent a160fa1 commit 4c53801

32 files changed

+456
-1089
lines changed

packages/check/src/main.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use anyhow::Context;
99
use clap::{Arg, ArgAction, Command};
1010
use colored::Colorize;
1111

12-
use cosmwasm_std::from_json;
12+
use cosmwasm_std::{from_json, StdResultExt};
1313
use cosmwasm_vm::internals::{check_wasm, compile, make_compiling_engine, LogOutput, Logger};
1414
use cosmwasm_vm::{capabilities_from_csv, WasmLimits};
1515

@@ -119,11 +119,18 @@ If this is not provided, the default values are used.")
119119
fn read_wasm_limits(input: &str) -> anyhow::Result<WasmLimits> {
120120
// try to parse JSON, if that fails, try to open as File and parse that
121121
from_json::<WasmLimits>(input)
122+
.unwrap_std_error()
123+
.map_err(anyhow::Error::from_boxed)
122124
.context("error parsing wasm limits")
123125
.or_else(|_| {
124126
std::fs::read_to_string(input)
125127
.context("error reading wasm limits file")
126-
.and_then(|s| from_json(s).context("error parsing wasm limits file"))
128+
.and_then(|s| {
129+
from_json(s)
130+
.unwrap_std_error()
131+
.map_err(anyhow::Error::from_boxed)
132+
.context("error parsing wasm limits file")
133+
})
127134
})
128135
}
129136

packages/check/tests/cosmwasm_check_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use assert_cmd::prelude::*;
2-
use cosmwasm_std::{to_json_string, to_json_vec};
2+
use cosmwasm_std::{to_json_string, to_json_vec, StdResult};
33
use cosmwasm_vm::WasmLimits;
44
use predicates::prelude::*;
55
use std::{io::Write, process::Command};
@@ -116,7 +116,7 @@ fn wasm_limits_string_check() -> Result<(), Box<dyn std::error::Error>> {
116116
}
117117

118118
#[test]
119-
fn wasm_limits_file_check() -> Result<(), Box<dyn std::error::Error>> {
119+
fn wasm_limits_file_check() -> StdResult<()> {
120120
let mut cmd = Command::cargo_bin("cosmwasm-check")?;
121121

122122
let mut limits = WasmLimits::default();

packages/std/src/addresses.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,7 @@ impl fmt::Display for Instantiate2AddressError {
299299
/// let canonical_creator = deps.api.addr_canonicalize(env.contract.address.as_str())?;
300300
/// let checksum = HexBinary::from_hex("9af782a3a1bcbcd22dbb6a45c751551d9af782a3a1bcbcd22dbb6a45c751551d")?;
301301
/// let salt = b"instance 1231";
302-
/// let canonical_addr = instantiate2_address(&checksum, &canonical_creator, salt)
303-
/// .map_err(|_| StdError::generic_err("Could not calculate addr"))?;
302+
/// let canonical_addr = instantiate2_address(&checksum, &canonical_creator, salt)?;
304303
/// let addr = deps.api.addr_humanize(&canonical_addr)?;
305304
///
306305
/// # Ok(Default::default())

packages/std/src/assertions.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -107,30 +107,30 @@ macro_rules! ensure_ne {
107107

108108
#[cfg(test)]
109109
mod tests {
110-
use crate::StdError;
110+
use crate::{errors::ErrorKind, StdError};
111111

112112
#[test]
113113
fn ensure_works() {
114114
fn check(a: usize, b: usize) -> Result<(), StdError> {
115-
ensure!(a == b, StdError::generic_err("foobar"));
115+
ensure!(a == b, StdError::msg("foobar"));
116116
Ok(())
117117
}
118118

119119
let err = check(5, 6).unwrap_err();
120-
assert!(matches!(err, StdError::GenericErr { .. }));
120+
assert!(matches!(err.kind(), ErrorKind::Other));
121121

122122
check(5, 5).unwrap();
123123
}
124124

125125
#[test]
126126
fn ensure_can_infer_error_type() {
127127
let check = |a, b| {
128-
ensure!(a == b, StdError::generic_err("foobar"));
128+
ensure!(a == b, StdError::msg("foobar"));
129129
Ok(())
130130
};
131131

132-
let err = check(5, 6).unwrap_err();
133-
assert!(matches!(err, StdError::GenericErr { .. }));
132+
let err: StdError = check(5, 6).unwrap_err();
133+
assert!(matches!(err.kind(), ErrorKind::Other));
134134

135135
check(5, 5).unwrap();
136136
}
@@ -147,7 +147,7 @@ mod tests {
147147
}
148148

149149
fn check(a: usize, b: usize) -> Result<(), ContractError> {
150-
ensure!(a == b, StdError::generic_err("foobar"));
150+
ensure!(a == b, StdError::msg("foobar"));
151151
Ok(())
152152
}
153153

@@ -160,12 +160,12 @@ mod tests {
160160
#[test]
161161
fn ensure_eq_works() {
162162
let check = |a, b| {
163-
ensure_eq!(a, b, StdError::generic_err("foobar"));
163+
ensure_eq!(a, b, StdError::msg("foobar"));
164164
Ok(())
165165
};
166166

167-
let err = check("123", "456").unwrap_err();
168-
assert!(matches!(err, StdError::GenericErr { .. }));
167+
let err: StdError = check("123", "456").unwrap_err();
168+
assert!(matches!(err.kind(), ErrorKind::Other));
169169
check("123", "123").unwrap();
170170
}
171171

@@ -176,7 +176,7 @@ mod tests {
176176

177177
#[allow(clippy::nonminimal_bool)]
178178
fn check() -> Result<(), StdError> {
179-
ensure_eq!(true || false, false, StdError::generic_err("foobar"));
179+
ensure_eq!(true || false, false, StdError::msg("foobar"));
180180
Ok(())
181181
}
182182

@@ -186,12 +186,12 @@ mod tests {
186186
#[test]
187187
fn ensure_ne_works() {
188188
let check = |a, b| {
189-
ensure_ne!(a, b, StdError::generic_err("foobar"));
189+
ensure_ne!(a, b, StdError::msg("foobar"));
190190
Ok(())
191191
};
192192

193-
let err = check("123", "123").unwrap_err();
194-
assert!(matches!(err, StdError::GenericErr { .. }));
193+
let err: StdError = check("123", "123").unwrap_err();
194+
assert!(matches!(err.kind(), ErrorKind::Other));
195195
check("123", "456").unwrap();
196196
}
197197

@@ -202,7 +202,7 @@ mod tests {
202202

203203
#[allow(clippy::nonminimal_bool)]
204204
fn check() -> Result<(), StdError> {
205-
ensure_ne!(true || false, false, StdError::generic_err("foobar"));
205+
ensure_ne!(true || false, false, StdError::msg("foobar"));
206206
Ok(())
207207
}
208208

packages/std/src/binary.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize};
66

77
use crate::{
88
encoding::{from_base64, to_base64},
9-
errors::{StdError, StdResult},
9+
errors::{ErrorKind, StdError, StdResult},
1010
};
1111

1212
/// Binary is a wrapper around Vec<u8> to add base64 de/serialization
@@ -62,7 +62,10 @@ impl Binary {
6262
/// ```
6363
pub fn to_array<const LENGTH: usize>(&self) -> StdResult<[u8; LENGTH]> {
6464
if self.len() != LENGTH {
65-
return Err(StdError::invalid_data_size(LENGTH, self.len()));
65+
return Err(StdError::msg(format_args!(
66+
"invalid length. expected {LENGTH}, got {}",
67+
self.len()
68+
)));
6669
}
6770

6871
let mut out: [u8; LENGTH] = [0; LENGTH];
@@ -71,7 +74,8 @@ impl Binary {
7174
}
7275

7376
pub fn from_hex(input: &str) -> StdResult<Self> {
74-
let binary = hex::decode(input).map_err(StdError::invalid_hex)?;
77+
let binary = hex::decode(input)
78+
.map_err(|err| StdError::from(err).with_kind(ErrorKind::InvalidData))?;
7579
Ok(Self(binary))
7680
}
7781

@@ -280,7 +284,6 @@ impl de::Visitor<'_> for BytesVisitor {
280284
mod tests {
281285
use super::*;
282286
use crate::assert_hash_works;
283-
use crate::errors::StdError;
284287

285288
#[test]
286289
fn to_array_works() {
@@ -297,15 +300,9 @@ mod tests {
297300
// invalid size
298301
let binary = Binary::from(&[1, 2, 3]);
299302
let error = binary.to_array::<8>().unwrap_err();
300-
match error {
301-
StdError::InvalidDataSize {
302-
expected, actual, ..
303-
} => {
304-
assert_eq!(expected, 8);
305-
assert_eq!(actual, 3);
306-
}
307-
err => panic!("Unexpected error: {err:?}"),
308-
}
303+
assert!(error
304+
.to_string()
305+
.ends_with("invalid length. expected 8, got 3"));
309306

310307
// long array (32 bytes)
311308
let binary = Binary::from_base64("t119JOQox4WUQEmO/nyqOZfO+wjJm91YG2sfn4ZglvA=").unwrap();
@@ -345,8 +342,8 @@ mod tests {
345342
] {
346343
let value = Binary::from(value);
347344
assert_eq!(encoded, value.to_base64());
348-
assert_eq!(Ok(value.clone()), Binary::from_base64(encoded));
349-
assert_eq!(Ok(value.clone()), Binary::from_base64(encoded_no_pad));
345+
assert_eq!(value.clone(), Binary::from_base64(encoded).unwrap());
346+
assert_eq!(value.clone(), Binary::from_base64(encoded_no_pad).unwrap());
350347
}
351348
}
352349

@@ -356,10 +353,10 @@ mod tests {
356353
("cm%uZG9taVo", "Invalid symbol 37, offset 2."),
357354
("cmFuZ", "Invalid input length: 5"),
358355
] {
359-
match Binary::from_base64(invalid_base64) {
360-
Err(StdError::InvalidBase64 { msg, .. }) => assert_eq!(want, msg),
361-
result => panic!("Unexpected result: {result:?}"),
362-
}
356+
assert!(Binary::from_base64(invalid_base64)
357+
.unwrap_err()
358+
.to_string()
359+
.ends_with(want));
363360
}
364361
}
365362

packages/std/src/checksum.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use serde::{de, ser, Deserialize, Deserializer, Serialize};
55
use sha2::{Digest, Sha256};
66
use thiserror::Error;
77

8+
use crate::errors::ErrorKind;
89
use crate::prelude::*;
910
use crate::{StdError, StdResult};
1011

@@ -25,7 +26,8 @@ impl Checksum {
2526
/// Errors if the string contains non-hex characters or does not contain 32 bytes.
2627
pub fn from_hex(input: &str) -> StdResult<Self> {
2728
let mut binary = [0u8; 32];
28-
hex::decode_to_slice(input, &mut binary).map_err(StdError::invalid_hex)?;
29+
hex::decode_to_slice(input, &mut binary)
30+
.map_err(|err| StdError::from(err).with_kind(ErrorKind::Parsing))?;
2931

3032
Ok(Self(binary))
3133
}

packages/std/src/coins.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ mod tests {
380380
assert_eq!(Coins::default().to_string(), "");
381381
assert_eq!(
382382
Coins::from_str(invalid).unwrap_err().to_string(),
383-
"Generic error: Parsing Coin: Missing amount or non-digit characters in amount"
383+
"kind: Other, error: Missing amount or non-digit characters in amount"
384384
);
385385
}
386386

@@ -452,12 +452,10 @@ mod tests {
452452
let mut coins: Coins = coin(12345, "uatom").into();
453453

454454
// sub more than available
455-
let err = coins.sub(coin(12346, "uatom")).unwrap_err();
456-
assert!(matches!(err, StdError::Overflow { .. }));
455+
assert!(coins.sub(coin(12346, "uatom")).is_err());
457456

458457
// sub non-existent denom
459-
let err = coins.sub(coin(12345, "uusd")).unwrap_err();
460-
assert!(matches!(err, StdError::Overflow { .. }));
458+
assert!(coins.sub(coin(12345, "uusd")).is_err());
461459

462460
// partial sub
463461
coins.sub(coin(1, "uatom")).unwrap();

packages/std/src/encoding.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use alloc::{string::String, vec::Vec};
22
use base64::{engine::GeneralPurpose, Engine};
33

4-
use crate::{StdError, StdResult};
4+
use crate::StdResult;
55

66
/// Base64 encoding engine used in conversion to/from base64.
77
///
@@ -18,7 +18,7 @@ pub fn from_base64<I>(input: I) -> StdResult<Vec<u8>>
1818
where
1919
I: AsRef<[u8]>,
2020
{
21-
B64_ENGINE.decode(input).map_err(StdError::invalid_base64)
21+
Ok(B64_ENGINE.decode(input)?)
2222
}
2323

2424
/// Encode a bag of bytes into the Base64 format
@@ -34,7 +34,7 @@ pub fn from_hex<I>(input: I) -> StdResult<Vec<u8>>
3434
where
3535
I: AsRef<[u8]>,
3636
{
37-
hex::decode(input).map_err(StdError::invalid_hex)
37+
Ok(hex::decode(input)?)
3838
}
3939

4040
/// Encode a bag of bytes into the hex format

packages/std/src/errors/backtrace.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,6 @@ impl Display for Stub {
5454
}
5555
}
5656

57-
/// This macro implements `From` for a given error type to a given error type where
58-
/// the target error has a `backtrace` field.
59-
/// This is meant as a replacement for `thiserror`'s `#[from]` attribute, which does not
60-
/// work with our custom backtrace wrapper.
61-
macro_rules! impl_from_err {
62-
($from:ty, $to:ty, $map:path) => {
63-
impl From<$from> for $to {
64-
fn from(err: $from) -> Self {
65-
$map {
66-
source: err,
67-
backtrace: $crate::errors::backtrace::BT::capture(),
68-
}
69-
}
70-
}
71-
};
72-
}
73-
pub(crate) use impl_from_err;
74-
7557
#[cfg(test)]
7658
mod tests {
7759
use super::*;

packages/std/src/errors/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ mod std_error;
44
mod system_error;
55
mod verification_error;
66

7-
pub(crate) use backtrace::{impl_from_err, BT};
7+
pub(crate) use backtrace::BT;
88
pub use recover_pubkey_error::RecoverPubkeyError;
99
pub use std_error::{
1010
CheckedFromRatioError, CheckedMultiplyFractionError, CheckedMultiplyRatioError,
1111
CoinFromStrError, CoinsError, ConversionOverflowError, DivideByZeroError, DivisionError,
12-
OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError, StdError,
13-
StdResult,
12+
ErrorKind, OverflowError, OverflowOperation, RoundDownOverflowError, RoundUpOverflowError,
13+
StdError, StdResult, StdResultExt,
1414
};
1515
pub use system_error::SystemError;
1616
pub use verification_error::{AggregationError, PairingEqualityError, VerificationError};

0 commit comments

Comments
 (0)