Merge rust-bitcoin/rust-bitcoin#4127: units: Prevent casting pub enums as ints

97453ef9bc units: Prevent casting pub enums as ints (Tobin C. Harding)

Pull request description:

  A public enum with simple variants gets an automatic integer variant that can be cast by library consumers. This puts a unnecessary maintenance burden upon us because we cannot then add variants in the middle of others.

  Add a hidden variant to the single public non-error enum in `units`.

ACKs for top commit:
  Kixunil:
    ACK 97453ef9bc
  apoelstra:
    ACK 97453ef9bc2b99a67252419ff015f13679df7312; successfully ran local tests

Tree-SHA512: 2515152107fb21a2dbdef9b46308fef6bd45f4a9719da7a39149b3bdbce6a93dc0f98e112ac246eb32dbe4df1210d5e6328c26ea8678e3da15276e893b39cc9c
This commit is contained in:
merge-script 2025-03-07 17:32:54 +00:00
commit 1a18ff582c
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
1 changed files with 6 additions and 0 deletions

View File

@ -91,6 +91,10 @@ pub enum Denomination {
Bit,
/// satoshi (1 BTC = 100,000,000 satoshi).
Satoshi,
/// Stops users from casting this enum to an integer.
// May get removed if one day Rust supports disabling casts natively.
#[doc(hidden)]
_DoNotUse(Infallible),
}
impl Denomination {
@ -109,6 +113,7 @@ impl Denomination {
Denomination::MicroBitcoin => -2,
Denomination::Bit => -2,
Denomination::Satoshi => 0,
Denomination::_DoNotUse(infallible) => match infallible {}
}
}
@ -121,6 +126,7 @@ impl Denomination {
Denomination::MicroBitcoin => "uBTC",
Denomination::Bit => "bits",
Denomination::Satoshi => "satoshi",
Denomination::_DoNotUse(infallible) => match infallible {}
}
}