digitex/
dynamic.rs

1use std::fmt::Display;
2
3use super::into;
4
5pub struct Digit<const BASE: u32> {
6    raw_value: u64,
7}
8
9impl<const BASE: u32> Digit<BASE> {
10    pub fn new(raw: u64) -> Self {
11        Self { raw_value: raw }
12    }
13
14    pub fn raw(&self) -> u64 {
15        self.raw_value
16    }
17
18    pub fn convert(&self) -> Vec<u32> {
19        into(self.raw(), BASE)
20    }
21}
22
23impl<const BASE: u32> Display for Digit<BASE> {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        let v = self.convert();
26        for c in v {
27            if BASE <= 10 {
28                write!(f, "{}", c)?
29            } else {
30                unimplemented!("how to display?")
31            }
32        }
33
34        Ok(())
35    }
36}
37
38#[cfg(test)]
39mod test {
40    use super::Digit;
41
42    #[test]
43    fn from_raw_test() {
44        assert_eq!(Digit::<2>::new(18).convert(), vec![1, 0, 0, 1, 0]);
45        assert_eq!(Digit::<8>::new(18).convert(), vec![2, 2]);
46        assert_eq!(Digit::<10>::new(13).convert(), vec![1, 3]);
47        assert_eq!(Digit::<16>::new(13).convert(), vec![13]);
48    }
49
50    #[test]
51    fn stringify_test() {
52        let octal = Digit::<8>::new(134);
53        assert_eq!(octal.to_string(), "206");
54    }
55}