use crate::result::Result;
use super::{ExtCsd, ExtCsdIndex};
mod index;
pub use index::*;
impl ExtCsd {
pub const fn vendor_specific(&self, index: Index) -> u8 {
self.0[index.into_ext_csd_index().into_inner()]
}
pub fn set_vendor_specific(&mut self, index: Index, val: u8) {
self.0[index.into_ext_csd_index().into_inner()] = val;
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::result::Error;
#[test]
fn test_vendor_specific() {
let mut ext_csd = ExtCsd::new();
(0..=63)
.filter_map(|i| Index::try_from_inner(i).ok())
.for_each(|index| {
assert_eq!(ext_csd.vendor_specific(index), 0);
assert!(
(ExtCsdIndex::VENDOR_SPECIFIED_START..=ExtCsdIndex::VENDOR_SPECIFIED_END)
.contains(&index.into_ext_csd_index().into_inner())
);
(0..=u8::MAX).for_each(|val| {
ext_csd.set_vendor_specific(index, val);
assert_eq!(ext_csd.vendor_specific(index), val);
});
});
(64..=505).for_each(|invalid_index| {
let exp_err =
Error::invalid_field_variant("ext_csd::vendor_specific::index", invalid_index);
assert_eq!(Index::try_from_inner(invalid_index), Err(exp_err));
});
(0..=505)
.filter_map(|r| {
if !(ExtCsdIndex::VENDOR_SPECIFIED_START..=ExtCsdIndex::VENDOR_SPECIFIED_END)
.contains(&r)
{
ExtCsdIndex::try_from_inner(r).ok()
} else {
None
}
})
.for_each(|invalid_ext_csd_index| {
let exp_err = Error::invalid_field_variant(
"ext_csd::vendor_specific::index",
invalid_ext_csd_index.into_inner(),
);
assert_eq!(
Index::try_from_ext_csd_index(invalid_ext_csd_index),
Err(exp_err)
);
});
}
}