midi_io/midi/
data_byte.rs1use 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}