pub enum NumOpResult<T> {
Valid(T),
Error(NumOpError),
}Expand description
Result of a mathematical operation on two numeric types.
In order to prevent overflow we provide a custom result type that is similar to the normal
core::result::Result but implements mathematical operations (e.g. core::ops::Add) so that
math operations can be chained ergonomically. This is very similar to how NaN works.
NumOpResult is a monadic type that contains Valid and Error (similar to Ok and Err).
It supports a subset of functions similar to Result (e.g. unwrap).
§Examples
The NumOpResult type provides protection against overflow and div-by-zero.
§Overflow protection
// Example UTXO value.
let a1 = Amount::from_sat(1_000_000)?;
// And another value from some other UTXO.
let a2 = Amount::from_sat(765_432)?;
// Just an example (typically one would calculate fee using weight and fee rate).
let fee = Amount::from_sat(1_00)?;
// The amount we want to send.
let spend = Amount::from_sat(1_200_000)?;
// We can error if the change calculation overflows.
//
// For example if the `spend` value comes from the user and the `change` value is later
// used then overflow here could be an attack vector.
let _change = (a1 + a2 - spend - fee).into_result().expect("handle this error");
// Or if we control all the values and know they are sane we can just `unwrap`.
let _change = (a1 + a2 - spend - fee).unwrap();
// `NumOpResult` also implements `expect`.
let _change = (a1 + a2 - spend - fee).expect("we know values don't overflow");§Divide-by-zero (overflow in Div or Rem)
In some instances one may wish to differentiate div-by-zero from overflow.
// Two amounts that will be added to calculate the max fee.
let a = Amount::from_sat(123).expect("valid amount");
let b = Amount::from_sat(467).expect("valid amount");
// Fee rate for transaction.
let fee_rate = FeeRate::from_sat_per_vb(1);
// Somewhat contrived example to show addition operator chained with division.
let max_fee = a + b;
let _fee = match max_fee / fee_rate {
NumOpResult::Valid(fee) => fee,
NumOpResult::Error(e) if e.is_div_by_zero() => {
// Do something when div by zero.
return Err(e);
},
NumOpResult::Error(e) => {
// We separate div-by-zero from overflow in case it needs to be handled separately.
//
// This branch could be hit since `max_fee` came from some previous calculation. And if
// an input to that calculation was from the user then overflow could be an attack vector.
return Err(e);
}
};Variants§
Valid(T)
Result of a successful mathematical operation.
Error(NumOpError)
Result of an unsuccessful mathematical operation.
Implementations§
Source§impl<T> NumOpResult<T>
impl<T> NumOpResult<T>
Sourcepub fn map<U, F: FnOnce(T) -> U>(self, op: F) -> NumOpResult<U>
pub fn map<U, F: FnOnce(T) -> U>(self, op: F) -> NumOpResult<U>
Maps a NumOpResult<T> to NumOpResult<U> by applying a function to a
contained NumOpResult::Valid value, leaving a NumOpResult::Error value untouched.
Source§impl<T: Debug> NumOpResult<T>
impl<T: Debug> NumOpResult<T>
Sourcepub fn expect(self, msg: &str) -> T
pub fn expect(self, msg: &str) -> T
Returns the contained valid numeric type, consuming self.
§Panics
Panics with msg if the numeric result is an Error.
Sourcepub fn unwrap(self) -> T
pub fn unwrap(self) -> T
Returns the contained valid numeric type, consuming self.
§Panics
Panics if the numeric result is an Error.
Sourcepub fn unwrap_err(self) -> NumOpError
pub fn unwrap_err(self) -> NumOpError
Sourcepub fn unwrap_or(self, default: T) -> T
pub fn unwrap_or(self, default: T) -> T
Returns the contained Some value or a provided default.
Arguments passed to unwrap_or are eagerly evaluated; if you are passing the result of a
function call, it is recommended to use unwrap_or_else, which is lazily evaluated.
Sourcepub fn unwrap_or_else<F>(self, f: F) -> Twhere
F: FnOnce() -> T,
pub fn unwrap_or_else<F>(self, f: F) -> Twhere
F: FnOnce() -> T,
Returns the contained Some value or computes it from a closure.
Sourcepub fn into_result(self) -> Result<T, NumOpError>
pub fn into_result(self) -> Result<T, NumOpError>
Converts this NumOpResult to a Result<T, NumOpError>.
Trait Implementations§
Source§impl<'a> Add<&'a NumOpResult<SignedAmount>> for &SignedAmount
impl<'a> Add<&'a NumOpResult<SignedAmount>> for &SignedAmount
Source§type Output = <SignedAmount as Add<NumOpResult<SignedAmount>>>::Output
type Output = <SignedAmount as Add<NumOpResult<SignedAmount>>>::Output
+ operator.Source§fn add(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
fn add(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
+ operation. Read moreSource§impl Add<&NumOpResult<SignedAmount>> for SignedAmount
impl Add<&NumOpResult<SignedAmount>> for SignedAmount
Source§type Output = <SignedAmount as Add<NumOpResult<SignedAmount>>>::Output
type Output = <SignedAmount as Add<NumOpResult<SignedAmount>>>::Output
+ operator.Source§fn add(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
fn add(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
+ operation. Read moreSource§impl<'a, T> Add<&'a NumOpResult<T>> for &NumOpResult<T>
impl<'a, T> Add<&'a NumOpResult<T>> for &NumOpResult<T>
Source§impl<T> Add<&NumOpResult<T>> for NumOpResult<T>
impl<T> Add<&NumOpResult<T>> for NumOpResult<T>
Source§impl<'a, T> Add<&'a T> for &NumOpResult<T>
impl<'a, T> Add<&'a T> for &NumOpResult<T>
Source§impl<T> Add<&T> for NumOpResult<T>
impl<T> Add<&T> for NumOpResult<T>
Source§impl Add<NumOpResult<SignedAmount>> for &SignedAmount
impl Add<NumOpResult<SignedAmount>> for &SignedAmount
Source§type Output = <SignedAmount as Add<NumOpResult<SignedAmount>>>::Output
type Output = <SignedAmount as Add<NumOpResult<SignedAmount>>>::Output
+ operator.Source§fn add(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
fn add(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
+ operation. Read moreSource§impl Add<NumOpResult<SignedAmount>> for SignedAmount
impl Add<NumOpResult<SignedAmount>> for SignedAmount
Source§type Output = NumOpResult<SignedAmount>
type Output = NumOpResult<SignedAmount>
+ operator.Source§fn add(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
fn add(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
+ operation. Read moreSource§impl<T> Add<NumOpResult<T>> for &NumOpResult<T>
impl<T> Add<NumOpResult<T>> for &NumOpResult<T>
Source§impl<T> Add<T> for &NumOpResult<T>
impl<T> Add<T> for &NumOpResult<T>
Source§impl<T> Add<T> for NumOpResult<T>
impl<T> Add<T> for NumOpResult<T>
Source§impl<T> Add for NumOpResult<T>
impl<T> Add for NumOpResult<T>
Source§impl AddAssign<Amount> for NumOpResult<Amount>
impl AddAssign<Amount> for NumOpResult<Amount>
Source§fn add_assign(&mut self, rhs: Amount)
fn add_assign(&mut self, rhs: Amount)
+= operation. Read moreSource§impl AddAssign<SignedAmount> for NumOpResult<SignedAmount>
impl AddAssign<SignedAmount> for NumOpResult<SignedAmount>
Source§fn add_assign(&mut self, rhs: SignedAmount)
fn add_assign(&mut self, rhs: SignedAmount)
+= operation. Read moreSource§impl<T: AddAssign> AddAssign<T> for NumOpResult<T>
impl<T: AddAssign> AddAssign<T> for NumOpResult<T>
Source§fn add_assign(&mut self, rhs: T)
fn add_assign(&mut self, rhs: T)
+= operation. Read moreSource§impl AddAssign for NumOpResult<Amount>
impl AddAssign for NumOpResult<Amount>
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+= operation. Read moreSource§impl AddAssign for NumOpResult<SignedAmount>
impl AddAssign for NumOpResult<SignedAmount>
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+= operation. Read moreSource§impl<T: AddAssign + Copy> AddAssign for NumOpResult<T>
impl<T: AddAssign + Copy> AddAssign for NumOpResult<T>
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+= operation. Read moreSource§impl<'a, T: Arbitrary<'a>> Arbitrary<'a> for NumOpResult<T>
Available on crate feature arbitrary only.
impl<'a, T: Arbitrary<'a>> Arbitrary<'a> for NumOpResult<T>
arbitrary only.Source§fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self>
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self>
Self from the given unstructured data. Read moreSource§fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>
fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self, Error>
Self from the entirety of the given
unstructured data. Read moreSource§fn size_hint(depth: usize) -> (usize, Option<usize>)
fn size_hint(depth: usize) -> (usize, Option<usize>)
Unstructured this type
needs to construct itself. Read moreSource§fn try_size_hint(
depth: usize,
) -> Result<(usize, Option<usize>), MaxRecursionReached>
fn try_size_hint( depth: usize, ) -> Result<(usize, Option<usize>), MaxRecursionReached>
Unstructured this type
needs to construct itself. Read moreSource§impl<T: Clone> Clone for NumOpResult<T>
impl<T: Clone> Clone for NumOpResult<T>
Source§fn clone(&self) -> NumOpResult<T>
fn clone(&self) -> NumOpResult<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Debug> Debug for NumOpResult<T>
impl<T: Debug> Debug for NumOpResult<T>
Source§impl<'a> Div<&'a NumOpResult<FeeRate>> for &NumOpResult<Amount>
impl<'a> Div<&'a NumOpResult<FeeRate>> for &NumOpResult<Amount>
Source§impl Div<&NumOpResult<FeeRate>> for NumOpResult<Amount>
impl Div<&NumOpResult<FeeRate>> for NumOpResult<Amount>
Source§impl<'a> Div<&'a NumOpResult<Weight>> for &NumOpResult<Amount>
impl<'a> Div<&'a NumOpResult<Weight>> for &NumOpResult<Amount>
Source§impl Div<&NumOpResult<Weight>> for NumOpResult<Amount>
impl Div<&NumOpResult<Weight>> for NumOpResult<Amount>
Source§impl<'a> Div<&'a i64> for &NumOpResult<SignedAmount>
impl<'a> Div<&'a i64> for &NumOpResult<SignedAmount>
Source§impl Div<&i64> for NumOpResult<SignedAmount>
impl Div<&i64> for NumOpResult<SignedAmount>
Source§impl Div<NumOpResult<FeeRate>> for &NumOpResult<Amount>
impl Div<NumOpResult<FeeRate>> for &NumOpResult<Amount>
Source§impl Div<NumOpResult<FeeRate>> for NumOpResult<Amount>
impl Div<NumOpResult<FeeRate>> for NumOpResult<Amount>
Source§impl Div<NumOpResult<Weight>> for &NumOpResult<Amount>
impl Div<NumOpResult<Weight>> for &NumOpResult<Amount>
Source§impl Div<NumOpResult<Weight>> for NumOpResult<Amount>
impl Div<NumOpResult<Weight>> for NumOpResult<Amount>
Source§impl Div<i64> for &NumOpResult<SignedAmount>
impl Div<i64> for &NumOpResult<SignedAmount>
Source§impl Div<i64> for NumOpResult<SignedAmount>
impl Div<i64> for NumOpResult<SignedAmount>
Source§impl DivAssign<&i64> for NumOpResult<SignedAmount>
impl DivAssign<&i64> for NumOpResult<SignedAmount>
Source§fn div_assign(&mut self, rhs: &i64)
fn div_assign(&mut self, rhs: &i64)
/= operation. Read moreSource§impl DivAssign<&u64> for NumOpResult<Amount>
impl DivAssign<&u64> for NumOpResult<Amount>
Source§fn div_assign(&mut self, rhs: &u64)
fn div_assign(&mut self, rhs: &u64)
/= operation. Read moreSource§impl DivAssign<i64> for NumOpResult<SignedAmount>
impl DivAssign<i64> for NumOpResult<SignedAmount>
Source§fn div_assign(&mut self, rhs: i64)
fn div_assign(&mut self, rhs: i64)
/= operation. Read moreSource§impl DivAssign<u64> for NumOpResult<Amount>
impl DivAssign<u64> for NumOpResult<Amount>
Source§fn div_assign(&mut self, rhs: u64)
fn div_assign(&mut self, rhs: u64)
/= operation. Read moreSource§impl From<&SignedAmount> for NumOpResult<SignedAmount>
impl From<&SignedAmount> for NumOpResult<SignedAmount>
Source§fn from(a: &SignedAmount) -> Self
fn from(a: &SignedAmount) -> Self
Source§impl From<SignedAmount> for NumOpResult<SignedAmount>
impl From<SignedAmount> for NumOpResult<SignedAmount>
Source§fn from(a: SignedAmount) -> Self
fn from(a: SignedAmount) -> Self
Source§impl<'a> Mul<&'a NumOpResult<FeeRate>> for &NumOpResult<Weight>
impl<'a> Mul<&'a NumOpResult<FeeRate>> for &NumOpResult<Weight>
Source§impl Mul<&NumOpResult<FeeRate>> for NumOpResult<Weight>
impl Mul<&NumOpResult<FeeRate>> for NumOpResult<Weight>
Source§impl<'a> Mul<&'a NumOpResult<SignedAmount>> for &i64
impl<'a> Mul<&'a NumOpResult<SignedAmount>> for &i64
Source§type Output = <i64 as Mul<NumOpResult<SignedAmount>>>::Output
type Output = <i64 as Mul<NumOpResult<SignedAmount>>>::Output
* operator.Source§fn mul(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
fn mul(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
* operation. Read moreSource§impl Mul<&NumOpResult<SignedAmount>> for i64
impl Mul<&NumOpResult<SignedAmount>> for i64
Source§type Output = <i64 as Mul<NumOpResult<SignedAmount>>>::Output
type Output = <i64 as Mul<NumOpResult<SignedAmount>>>::Output
* operator.Source§fn mul(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
fn mul(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
* operation. Read moreSource§impl<'a> Mul<&'a NumOpResult<Weight>> for &NumOpResult<FeeRate>
impl<'a> Mul<&'a NumOpResult<Weight>> for &NumOpResult<FeeRate>
Source§impl Mul<&NumOpResult<Weight>> for NumOpResult<FeeRate>
impl Mul<&NumOpResult<Weight>> for NumOpResult<FeeRate>
Source§impl<'a> Mul<&'a i64> for &NumOpResult<SignedAmount>
impl<'a> Mul<&'a i64> for &NumOpResult<SignedAmount>
Source§impl Mul<&i64> for NumOpResult<SignedAmount>
impl Mul<&i64> for NumOpResult<SignedAmount>
Source§impl Mul<NumOpResult<FeeRate>> for &NumOpResult<Weight>
impl Mul<NumOpResult<FeeRate>> for &NumOpResult<Weight>
Source§impl Mul<NumOpResult<FeeRate>> for NumOpResult<Weight>
impl Mul<NumOpResult<FeeRate>> for NumOpResult<Weight>
Source§impl Mul<NumOpResult<SignedAmount>> for &i64
impl Mul<NumOpResult<SignedAmount>> for &i64
Source§type Output = <i64 as Mul<NumOpResult<SignedAmount>>>::Output
type Output = <i64 as Mul<NumOpResult<SignedAmount>>>::Output
* operator.Source§fn mul(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
fn mul(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
* operation. Read moreSource§impl Mul<NumOpResult<SignedAmount>> for i64
impl Mul<NumOpResult<SignedAmount>> for i64
Source§type Output = NumOpResult<SignedAmount>
type Output = NumOpResult<SignedAmount>
* operator.Source§fn mul(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
fn mul(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
* operation. Read moreSource§impl Mul<NumOpResult<Weight>> for &NumOpResult<FeeRate>
impl Mul<NumOpResult<Weight>> for &NumOpResult<FeeRate>
Source§impl Mul<NumOpResult<Weight>> for NumOpResult<FeeRate>
impl Mul<NumOpResult<Weight>> for NumOpResult<FeeRate>
Source§impl Mul<i64> for &NumOpResult<SignedAmount>
impl Mul<i64> for &NumOpResult<SignedAmount>
Source§impl Mul<i64> for NumOpResult<SignedAmount>
impl Mul<i64> for NumOpResult<SignedAmount>
Source§impl MulAssign<&i64> for NumOpResult<SignedAmount>
impl MulAssign<&i64> for NumOpResult<SignedAmount>
Source§fn mul_assign(&mut self, rhs: &i64)
fn mul_assign(&mut self, rhs: &i64)
*= operation. Read moreSource§impl MulAssign<&u64> for NumOpResult<Amount>
impl MulAssign<&u64> for NumOpResult<Amount>
Source§fn mul_assign(&mut self, rhs: &u64)
fn mul_assign(&mut self, rhs: &u64)
*= operation. Read moreSource§impl MulAssign<i64> for NumOpResult<SignedAmount>
impl MulAssign<i64> for NumOpResult<SignedAmount>
Source§fn mul_assign(&mut self, rhs: i64)
fn mul_assign(&mut self, rhs: i64)
*= operation. Read moreSource§impl MulAssign<u64> for NumOpResult<Amount>
impl MulAssign<u64> for NumOpResult<Amount>
Source§fn mul_assign(&mut self, rhs: u64)
fn mul_assign(&mut self, rhs: u64)
*= operation. Read moreSource§impl<T: PartialEq> PartialEq for NumOpResult<T>
impl<T: PartialEq> PartialEq for NumOpResult<T>
Source§impl<'a> Rem<&'a i64> for &NumOpResult<SignedAmount>
impl<'a> Rem<&'a i64> for &NumOpResult<SignedAmount>
Source§impl Rem<&i64> for NumOpResult<SignedAmount>
impl Rem<&i64> for NumOpResult<SignedAmount>
Source§impl Rem<i64> for &NumOpResult<SignedAmount>
impl Rem<i64> for &NumOpResult<SignedAmount>
Source§impl Rem<i64> for NumOpResult<SignedAmount>
impl Rem<i64> for NumOpResult<SignedAmount>
Source§impl<'a> Sub<&'a NumOpResult<SignedAmount>> for &SignedAmount
impl<'a> Sub<&'a NumOpResult<SignedAmount>> for &SignedAmount
Source§type Output = <SignedAmount as Sub<NumOpResult<SignedAmount>>>::Output
type Output = <SignedAmount as Sub<NumOpResult<SignedAmount>>>::Output
- operator.Source§fn sub(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
fn sub(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
- operation. Read moreSource§impl Sub<&NumOpResult<SignedAmount>> for SignedAmount
impl Sub<&NumOpResult<SignedAmount>> for SignedAmount
Source§type Output = <SignedAmount as Sub<NumOpResult<SignedAmount>>>::Output
type Output = <SignedAmount as Sub<NumOpResult<SignedAmount>>>::Output
- operator.Source§fn sub(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
fn sub(self, rhs: &NumOpResult<SignedAmount>) -> Self::Output
- operation. Read moreSource§impl<'a, T> Sub<&'a NumOpResult<T>> for &NumOpResult<T>
impl<'a, T> Sub<&'a NumOpResult<T>> for &NumOpResult<T>
Source§impl<T> Sub<&NumOpResult<T>> for NumOpResult<T>
impl<T> Sub<&NumOpResult<T>> for NumOpResult<T>
Source§impl<'a, T> Sub<&'a T> for &NumOpResult<T>
impl<'a, T> Sub<&'a T> for &NumOpResult<T>
Source§impl<T> Sub<&T> for NumOpResult<T>
impl<T> Sub<&T> for NumOpResult<T>
Source§impl Sub<NumOpResult<SignedAmount>> for &SignedAmount
impl Sub<NumOpResult<SignedAmount>> for &SignedAmount
Source§type Output = <SignedAmount as Sub<NumOpResult<SignedAmount>>>::Output
type Output = <SignedAmount as Sub<NumOpResult<SignedAmount>>>::Output
- operator.Source§fn sub(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
fn sub(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
- operation. Read moreSource§impl Sub<NumOpResult<SignedAmount>> for SignedAmount
impl Sub<NumOpResult<SignedAmount>> for SignedAmount
Source§type Output = NumOpResult<SignedAmount>
type Output = NumOpResult<SignedAmount>
- operator.Source§fn sub(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
fn sub(self, rhs: NumOpResult<SignedAmount>) -> Self::Output
- operation. Read moreSource§impl<T> Sub<NumOpResult<T>> for &NumOpResult<T>
impl<T> Sub<NumOpResult<T>> for &NumOpResult<T>
Source§impl<T> Sub<T> for &NumOpResult<T>
impl<T> Sub<T> for &NumOpResult<T>
Source§impl<T> Sub<T> for NumOpResult<T>
impl<T> Sub<T> for NumOpResult<T>
Source§impl<T> Sub for NumOpResult<T>
impl<T> Sub for NumOpResult<T>
Source§impl SubAssign<Amount> for NumOpResult<Amount>
impl SubAssign<Amount> for NumOpResult<Amount>
Source§fn sub_assign(&mut self, rhs: Amount)
fn sub_assign(&mut self, rhs: Amount)
-= operation. Read moreSource§impl SubAssign<SignedAmount> for NumOpResult<SignedAmount>
impl SubAssign<SignedAmount> for NumOpResult<SignedAmount>
Source§fn sub_assign(&mut self, rhs: SignedAmount)
fn sub_assign(&mut self, rhs: SignedAmount)
-= operation. Read moreSource§impl<T: SubAssign> SubAssign<T> for NumOpResult<T>
impl<T: SubAssign> SubAssign<T> for NumOpResult<T>
Source§fn sub_assign(&mut self, rhs: T)
fn sub_assign(&mut self, rhs: T)
-= operation. Read moreSource§impl SubAssign for NumOpResult<Amount>
impl SubAssign for NumOpResult<Amount>
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
-= operation. Read moreSource§impl SubAssign for NumOpResult<SignedAmount>
impl SubAssign for NumOpResult<SignedAmount>
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
-= operation. Read moreSource§impl<T: SubAssign + Copy> SubAssign for NumOpResult<T>
impl<T: SubAssign + Copy> SubAssign for NumOpResult<T>
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
-= operation. Read more