svd_rs/
writeconstraint.rs1use super::SvdError;
2
3#[cfg_attr(
5 feature = "serde",
6 derive(serde::Deserialize, serde::Serialize),
7 serde(rename_all = "camelCase")
8)]
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub enum WriteConstraint {
11 WriteAsRead(bool),
13 UseEnumeratedValues(bool),
15 Range(WriteConstraintRange),
17}
18
19#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
21#[derive(Clone, Copy, Debug, PartialEq, Eq)]
22pub struct WriteConstraintRange {
23 #[cfg_attr(feature = "serde", serde(rename = "minimum"))]
25 pub min: u64,
26 #[cfg_attr(feature = "serde", serde(rename = "maximum"))]
28 pub max: u64,
29}
30
31#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
33pub enum Error {
34 #[error("Value {0} out of range {1:?}")]
36 OutOfRange(u64, core::ops::Range<u64>),
37 #[error("Range minimum {0} is greater than maximum {1}")]
39 ReversedRange(u64, u64),
40}
41
42impl WriteConstraintRange {
43 pub(crate) fn check_range(&self, range: core::ops::Range<u64>) -> Result<(), SvdError> {
44 if self.min > self.max {
45 return Err(Error::ReversedRange(self.min, self.max).into());
46 }
47 for v in [&self.min, &self.max] {
48 if !range.contains(v) {
49 return Err(Error::OutOfRange(*v, range).into());
50 }
51 }
52 Ok(())
53 }
54}