From 0dbcd09bbcd817cafd2108e2b470cad88aed4eb8 Mon Sep 17 00:00:00 2001 From: yancy Date: Mon, 26 May 2025 18:04:33 -0500 Subject: [PATCH] Move CheckedSum trait to crate root In order to add other types to CheckedSum, remove from the Amount module. In so doing, other types added to CheeckSum do not need to be imported into Amount. --- bitcoin/src/lib.rs | 7 ++++--- units/src/amount/mod.rs | 18 +----------------- units/src/lib.rs | 17 +++++++++++++++++ units/tests/api.rs | 4 ++-- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/bitcoin/src/lib.rs b/bitcoin/src/lib.rs index cb68c3543..60e151355 100644 --- a/bitcoin/src/lib.rs +++ b/bitcoin/src/lib.rs @@ -204,14 +204,15 @@ pub mod amount { #[rustfmt::skip] // Keep public re-exports separate. #[doc(inline)] + pub use units::CheckedSum; + #[cfg(feature = "serde")] + pub use units::amount::serde; pub use units::amount::{ - Amount, CheckedSum, Denomination, Display, InvalidCharacterError, MissingDenominationError, + Amount, Denomination, Display, InvalidCharacterError, MissingDenominationError, MissingDigitsError, OutOfRangeError, ParseAmountError, ParseDenominationError, ParseError, PossiblyConfusingDenominationError, SignedAmount, TooPreciseError, UnknownDenominationError, }; - #[cfg(feature = "serde")] - pub use units::amount::serde; impl Decodable for Amount { #[inline] diff --git a/units/src/amount/mod.rs b/units/src/amount/mod.rs index b08e6ebb4..19b4a9832 100644 --- a/units/src/amount/mod.rs +++ b/units/src/amount/mod.rs @@ -26,6 +26,7 @@ use core::str::FromStr; use arbitrary::{Arbitrary, Unstructured}; use self::error::{MissingDigitsKind, ParseAmountErrorInner, ParseErrorInner}; +use crate::CheckedSum; #[rustfmt::skip] // Keep public re-exports separate. #[doc(inline)] @@ -593,13 +594,6 @@ enum DisplayStyle { DynamicDenomination, } -/// Calculates the sum over the iterator using checked arithmetic. -pub trait CheckedSum: sealed::Sealed { - /// Calculates the sum over the iterator using checked arithmetic. If an - /// overflow happens it returns [`None`]. - fn checked_sum(self) -> Option; -} - impl CheckedSum for T where T: Iterator, @@ -616,16 +610,6 @@ where } } -mod sealed { - use super::{Amount, SignedAmount}; - - /// Used to seal the `CheckedSum` trait - pub trait Sealed {} - - impl Sealed for T where T: Iterator {} - impl Sealed for T where T: Iterator {} -} - #[cfg(feature = "arbitrary")] impl<'a> Arbitrary<'a> for Denomination { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { diff --git a/units/src/lib.rs b/units/src/lib.rs index 06d24d718..e6b36a7dd 100644 --- a/units/src/lib.rs +++ b/units/src/lib.rs @@ -69,3 +69,20 @@ pub(crate) use self::result::OptionExt; #[deprecated(since = "TBD", note = "use `BlockHeightInterval` instead")] #[doc(hidden)] pub type BlockInterval = BlockHeightInterval; + +/// Calculates the sum over the iterator using checked arithmetic. +pub trait CheckedSum: sealed::Sealed { + /// Calculates the sum over the iterator using checked arithmetic. If an + /// overflow happens it returns [`None`]. + fn checked_sum(self) -> Option; +} + +mod sealed { + use super::{Amount, SignedAmount}; + + /// Used to seal the `CheckedSum` trait + pub trait Sealed {} + + impl Sealed for T where T: Iterator {} + impl Sealed for T where T: Iterator {} +} diff --git a/units/tests/api.rs b/units/tests/api.rs index 33b60bc7b..cf5f5def4 100644 --- a/units/tests/api.rs +++ b/units/tests/api.rs @@ -15,7 +15,7 @@ use arbitrary::{Arbitrary, Unstructured}; use bitcoin_units::locktime::{absolute, relative}; // Typical usage is `absolute::Height`. use bitcoin_units::{ amount, block, fee_rate, locktime, parse, weight, Amount, BlockHeight, BlockInterval, BlockMtp, - BlockMtpInterval, BlockTime, FeeRate, SignedAmount, Weight, + BlockMtpInterval, BlockTime, CheckedSum, FeeRate, SignedAmount, Weight, }; /// A struct that includes all public non-error enums. @@ -272,7 +272,7 @@ fn regression_default() { fn dyn_compatible() { // If this builds then traits are dyn compatible. struct Traits { - a: Box>, + a: Box>, // These traits are explicitly not dyn compatible. // b: Box, // c: Box,