use core::fmt;
pub trait Ordinal {
fn num(&self) -> u128;
fn numh(&self) -> impl fmt::Display
where
Self: Sized,
{
NumHex(self.num())
}
}
struct NumHex(u128);
impl fmt::Display for NumHex {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:x}", self.0)
}
}
#[cfg(test)]
mod tests {
use alloc::string::ToString;
use super::*;
struct Bare(u128);
impl Ordinal for Bare {
fn num(&self) -> u128 {
self.0
}
}
#[test]
fn numh_renders_minimal_lowercase_hex() {
assert_eq!(Bare(0).numh().to_string(), "0");
assert_eq!(Bare(1).numh().to_string(), "1");
assert_eq!(Bare(10).numh().to_string(), "a");
assert_eq!(Bare(255).numh().to_string(), "ff");
assert_eq!(
Bare(u128::MAX).numh().to_string(),
"ffffffffffffffffffffffffffffffff"
);
}
#[test]
fn num_returns_value() {
assert_eq!(Bare(42).num(), 42);
}
}