use serde_derive::{Deserialize, Serialize};
use std::fmt;
#[derive(Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Hash, Debug)]
pub struct NationalNumber {
pub(crate) value: u64,
}
impl NationalNumber {
pub fn new(value: u64, zeros: u8) -> Result<Self, crate::error::Parse> {
if value >= (1 << 56) {
return Err(crate::error::Parse::TooLong);
}
Ok(Self {
value: ((zeros as u64) << 56) | value,
})
}
pub fn value(&self) -> u64 {
self.value & 0x00ffffffffffffff
}
pub fn zeros(&self) -> u8 {
(self.value >> 56) as u8
}
}
impl From<NationalNumber> for u64 {
fn from(n: NationalNumber) -> u64 {
n.value
}
}
impl fmt::Display for NationalNumber {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for _ in 0..self.zeros() {
write!(f, "0")?;
}
write!(f, "{}", self.value())
}
}