units: Make minor improvements to MathOp

Follow up from #4312, improve the `MathOp` type by:

- Do not provide public constructor
- Add cast protection
This commit is contained in:
Tobin C. Harding 2025-04-14 10:37:28 +10:00
parent e2149ec4e9
commit 0f62c9a582
No known key found for this signature in database
GPG Key ID: 40BF9E4C269D6607
1 changed files with 8 additions and 2 deletions

View File

@ -3,6 +3,7 @@
//! Provides a monodic type returned by mathematical operations (`core::ops`).
use core::fmt;
use core::convert::Infallible;
use NumOpResult as R;
@ -134,7 +135,7 @@ pub struct NumOpError(MathOp);
impl NumOpError {
/// Creates a [`NumOpError`] caused by `op`.
pub fn while_doing(op: MathOp) -> Self { NumOpError(op) }
pub(crate) fn while_doing(op: MathOp) -> Self { NumOpError(op) }
/// Returns the [`MathOp`] that caused this error.
pub fn operation(self) -> MathOp { self.0 }
@ -165,6 +166,10 @@ pub enum MathOp {
Rem,
/// Negation failed ([`core::ops::Neg`] resulted in an invalid value).
Neg,
/// 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 MathOp {
@ -179,13 +184,14 @@ impl MathOp {
impl fmt::Display for MathOp {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
match *self {
MathOp::Add => write!(f, "add"),
MathOp::Sub => write!(f, "sub"),
MathOp::Mul => write!(f, "mul"),
MathOp::Div => write!(f, "div"),
MathOp::Rem => write!(f, "rem"),
MathOp::Neg => write!(f, "neg"),
MathOp::_DoNotUse(infallible) => match infallible {},
}
}
}