svd_rs/
writeconstraint.rs

1use super::SvdError;
2
3/// Define constraints for writing values to a field
4#[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    /// If `true`, only the last read value can be written.
12    WriteAsRead(bool),
13    /// If `true`, only the values listed in the enumeratedValues list can be written.
14    UseEnumeratedValues(bool),
15    /// A range of numbers that can be written.
16    Range(WriteConstraintRange),
17}
18
19/// The smallest and largest number that can be written.
20#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
21#[derive(Clone, Copy, Debug, PartialEq, Eq)]
22pub struct WriteConstraintRange {
23    /// Specify the smallest number to be written to the field
24    #[cfg_attr(feature = "serde", serde(rename = "minimum"))]
25    pub min: u64,
26    /// Specify the largest number to be written to the field.
27    #[cfg_attr(feature = "serde", serde(rename = "maximum"))]
28    pub max: u64,
29}
30
31/// Errors for [`WriteConstraintRange::check_range`]
32#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
33pub enum Error {
34    /// The value is not in range.
35    #[error("Value {0} out of range {1:?}")]
36    OutOfRange(u64, core::ops::Range<u64>),
37    /// Minimum is greater than maximum.
38    #[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}