use crate::result::{Error, Result};
use crate::{lib_bitfield, response};
lib_bitfield! {
pub R1(u8): u8 {
pub idle: 0;
pub illegal_command: 2;
pub crc_error: 3;
pub function_number_error: 4;
pub parameter_error: 6;
}
}
response! {
R1 {
response_mode: Sdio,
}
}
impl R1 {
pub const MASK: u8 = 0b1010_0010;
pub const DEFAULT: u8 = 0;
pub const fn new() -> Self {
Self(Self::DEFAULT)
}
pub const fn try_from_bits(val: u8) -> Result<Self> {
match val {
v if (v & Self::MASK) != 0 => Err(Error::invalid_field_variant("r1", val as usize)),
v => Ok(Self(v)),
}
}
}
impl Default for R1 {
fn default() -> Self {
Self::new()
}
}
impl TryFrom<u8> for R1 {
type Error = Error;
fn try_from(val: u8) -> Result<Self> {
Self::try_from_bits(val)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_field;
#[test]
fn test_fields() {
let mut r1 = R1::new();
test_field!(r1, idle: 0);
test_field!(r1, illegal_command: 2);
test_field!(r1, crc_error: 3);
test_field!(r1, function_number_error: 4);
test_field!(r1, parameter_error: 6);
(0..=u8::MAX).for_each(|v| match v {
v if (v & R1::MASK) != 0 => {
let exp_err = Error::invalid_field_variant("r1", v as usize);
assert_eq!(R1::try_from_bits(v), Err(exp_err));
assert_eq!(R1::try_from(v), Err(exp_err));
}
_ => {
r1 = R1(v);
assert_eq!(R1::try_from_bits(v), Ok(r1));
assert_eq!(R1::try_from(v), Ok(r1));
}
});
}
}