feat(bin) : max_values Macro for CLI args parsing (#5379)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
DoTheBestToGetTheBest
2023-11-10 08:42:47 -08:00
committed by GitHub
parent 6c4a9cd1c3
commit 5beb105a7c

View File

@ -1,6 +1,6 @@
//! Additional helper types for CLI parsing.
use std::{fmt, str::FromStr};
use std::{fmt, num::ParseIntError, str::FromStr};
/// A helper type that maps `0` to `None` when parsing CLI arguments.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -36,6 +36,34 @@ impl FromStr for ZeroAsNone {
}
}
macro_rules! max_values {
($name:ident, $ty:ident) => {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
/// A helper type for parsing "max" as the maximum value of the specified type.
pub(crate) struct $name(pub(crate) $ty);
impl fmt::Display for $name {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl FromStr for $name {
type Err = ParseIntError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.eq_ignore_ascii_case("max") {
Ok($name(<$ty>::MAX))
} else {
s.parse::<$ty>().map($name)
}
}
}
};
}
max_values!(MaxU32, u32);
max_values!(MaxU64, u64);
#[cfg(test)]
mod tests {
use super::*;