digit_sequence/slices.rs
1use crate::{CrateError, CrateResult, DigitSequence};
2
3/// A slice of [u8] numbers can be converted to [DigitSequence]
4/// as long as its values are 0-9 digits; the empty slice is
5/// also acceptable.
6///
7/// ```
8/// use digit_sequence::*;
9///
10/// # fn main() -> GenericResult<()> {
11///
12/// let slice: &[u8] = &[];
13/// let sequence: DigitSequence = slice.try_into()?;
14/// assert_eq!(sequence, []);
15///
16/// let slice: &[u8] = &[9];
17/// let sequence: DigitSequence = slice.try_into()?;
18/// assert_eq!(sequence, [9]);
19///
20/// let slice: &[u8] = &[0, 5, 6, 9, 0];
21/// let sequence: DigitSequence = slice.try_into()?;
22/// assert_eq!(sequence, [0, 5, 6, 9, 0]);
23///
24/// # Ok(())
25/// # }
26/// ```
27///
28/// Out-of-range numbers result in a [CrateError::NonDigitNumber]:
29///
30/// ```
31/// use digit_sequence::*;
32///
33/// # fn main() -> GenericResult<()> {
34/// let slice: &[u8] = &[10];
35/// let sequence_result: CrateResult<DigitSequence> = slice.try_into();
36///
37/// assert_eq!(sequence_result, Err(CrateError::NonDigitNumber(10)));
38///
39/// # Ok(())
40/// # }
41/// ```
42impl TryFrom<&[u8]> for DigitSequence {
43 type Error = CrateError;
44
45 fn try_from(digits: &[u8]) -> CrateResult<Self> {
46 let mut digits_vec = vec![];
47
48 for &digit in digits {
49 if digit >= 10 {
50 return Err(CrateError::NonDigitNumber(digit as u128));
51 }
52
53 digits_vec.push(digit);
54 }
55
56 Ok(DigitSequence(digits_vec))
57 }
58}
59
60/// [DigitSequence] can be compared with a slice of [u8]:
61///
62/// ```
63/// use digit_sequence::*;
64///
65/// # fn main() -> GenericResult<()> {
66/// let source: [u8; 4] = [8, 2, 5, 7];
67/// let slice: &[u8] = &source;
68///
69/// let sequence: DigitSequence = slice.try_into()?;
70/// assert_eq!(sequence, slice);
71///
72/// let other: [u8; 4] = [8, 9, 0, 0];
73/// let other_slice: &[u8] = &other;
74///
75/// assert_ne!(sequence, other_slice);
76///
77/// # Ok(())
78/// # }
79/// ```
80impl PartialEq<&[u8]> for DigitSequence {
81 fn eq(&self, other: &&[u8]) -> bool {
82 self.0 == *other
83 }
84}