Skip to main content

midi_io/midi/
data_byte.rs

1use crate::ValueError;
2
3#[repr(transparent)]
4#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
5pub struct DataByte(u8);
6
7impl DataByte {
8    pub const fn get(self) -> u8 {
9        self.0
10    }
11}
12
13impl TryFrom<u8> for DataByte {
14    type Error = ValueError;
15
16    fn try_from(value: u8) -> Result<Self, Self::Error> {
17        if value > 0x7F {
18            Err(ValueError::DataByte(value))
19        } else {
20            Ok(Self(value))
21        }
22    }
23}
24
25impl From<DataByte> for u8 {
26    fn from(value: DataByte) -> Self {
27        value.0
28    }
29}
30
31impl std::fmt::Display for DataByte {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        write!(f, "{}", self.0)
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn data_byte_try_from_rejects_high_bit() {
43        assert_eq!(DataByte::try_from(0).map(DataByte::get), Ok(0));
44        assert_eq!(DataByte::try_from(127).map(DataByte::get), Ok(127));
45        assert_eq!(DataByte::try_from(128), Err(ValueError::DataByte(128)));
46        assert_eq!(DataByte::try_from(0xFF), Err(ValueError::DataByte(0xFF)));
47    }
48
49    #[test]
50    fn data_byte_is_one_byte() {
51        assert_eq!(std::mem::size_of::<DataByte>(), 1);
52    }
53}