#[must_use]
pub const fn hex_digit(byte: u8) -> Option<u8> {
match byte {
b'0'..=b'9' => Some(byte - b'0'),
b'a'..=b'f' => Some(byte - b'a' + 10),
b'A'..=b'F' => Some(byte - b'A' + 10),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::hex_digit;
#[test]
fn the_twenty_two_digits_and_nothing_else() {
let expected: Vec<(u8, u8)> = (b'0'..=b'9')
.zip(0..)
.chain((b'a'..=b'f').zip(10..))
.chain((b'A'..=b'F').zip(10..))
.collect();
for (byte, value) in &expected {
assert_eq!(hex_digit(*byte), Some(*value), "{}", char::from(*byte));
}
let hits = (0..=u8::MAX).filter(|b| hex_digit(*b).is_some()).count();
assert_eq!(hits, expected.len());
}
}