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}