use super::SvdError;
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize, serde::Serialize),
serde(rename_all = "camelCase")
)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WriteConstraint {
WriteAsRead(bool),
UseEnumeratedValues(bool),
Range(WriteConstraintRange),
}
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct WriteConstraintRange {
#[cfg_attr(feature = "serde", serde(rename = "minimum"))]
pub min: u64,
#[cfg_attr(feature = "serde", serde(rename = "maximum"))]
pub max: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
pub enum Error {
#[error("Value {0} out of range {1:?}")]
OutOfRange(u64, core::ops::Range<u64>),
#[error("Range minimum {0} is greater than maximum {1}")]
ReversedRange(u64, u64),
}
impl WriteConstraintRange {
pub(crate) fn check_range(&self, range: core::ops::Range<u64>) -> Result<(), SvdError> {
if self.min > self.max {
return Err(Error::ReversedRange(self.min, self.max).into());
}
for v in [&self.min, &self.max] {
if !range.contains(v) {
return Err(Error::OutOfRange(*v, range).into());
}
}
Ok(())
}
}