#[derive(Debug)]
pub enum FixedData<'a> {
Valid {
file_mark: bool,
eom: bool,
incorrect_length: bool,
key: u8,
info: [u8; 4],
cmd_info: [u8; 4],
asc: u8,
ascq: u8,
fruc: u8,
sks: [u8; 3],
more: &'a [u8],
},
Invalid(&'a [u8]),
}
fn copy_from_slice_3(x: &[u8]) -> [u8; 3] {
let mut y = [0; 3];
y.copy_from_slice(x);
y
}
fn copy_from_slice_4(x: &[u8]) -> [u8; 4] {
let mut y = [0; 4];
y.copy_from_slice(x);
y
}
pub fn parse(data: &[u8]) -> Option<FixedData> {
if data.len() < 18 {
return None;
}
if data[0] & 0b1000_0000 != 0 {
return Some(FixedData::Invalid(data));
}
let len = (data[7] + 8) as usize;
Some(FixedData::Valid {
file_mark: data[2] & 0b1000_0000 != 0,
eom: data[2] & 0b0100_0000 != 0,
incorrect_length: data[2] & 0b0010_0000 != 0,
key: data[2] & 0b1111,
info: copy_from_slice_4(&data[3..7]),
cmd_info: copy_from_slice_4(&data[8..12]),
asc: data[12],
ascq: data[13],
fruc: data[14],
sks: copy_from_slice_3(&data[15..18]),
more: if len > data.len() {
return None
} else {
&data[18 .. len]
}
})
}