1use super::{BuildError, Protection, SvdError, ValidateLevel};
2
3#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
5#[derive(Clone, Debug, PartialEq, Eq)]
6#[non_exhaustive]
7pub struct AddressBlock {
8 pub offset: u32,
10 pub size: u32,
12 pub usage: AddressBlockUsage,
14 #[cfg_attr(
16 feature = "serde",
17 serde(default, skip_serializing_if = "Option::is_none")
18 )]
19 pub protection: Option<Protection>,
20}
21
22#[cfg_attr(
24 feature = "serde",
25 derive(serde::Deserialize, serde::Serialize),
26 serde(rename_all = "kebab-case")
27)]
28#[derive(Clone, Copy, Debug, Eq, PartialEq)]
29pub enum AddressBlockUsage {
30 Registers,
32 Buffer,
34 Reserved,
36}
37
38impl Default for AddressBlockUsage {
39 fn default() -> Self {
40 Self::Registers
41 }
42}
43
44impl AddressBlockUsage {
45 pub fn parse_str(s: &str) -> Option<Self> {
47 match s {
48 "registers" => Some(Self::Registers),
49 "buffer" => Some(Self::Buffer),
50 "reserved" => Some(Self::Reserved),
51 _ => None,
52 }
53 }
54
55 pub const fn as_str(self) -> &'static str {
57 match self {
58 Self::Registers => "registers",
59 Self::Buffer => "buffer",
60 Self::Reserved => "reserved",
61 }
62 }
63}
64
65#[derive(Clone, Debug, Default, PartialEq, Eq)]
67pub struct AddressBlockBuilder {
68 offset: Option<u32>,
69 size: Option<u32>,
70 usage: Option<AddressBlockUsage>,
71 protection: Option<Protection>,
72}
73
74impl From<AddressBlock> for AddressBlockBuilder {
75 fn from(d: AddressBlock) -> Self {
76 Self {
77 offset: Some(d.offset),
78 size: Some(d.size),
79 usage: Some(d.usage),
80 protection: d.protection,
81 }
82 }
83}
84
85impl AddressBlockBuilder {
86 pub fn offset(mut self, value: u32) -> Self {
88 self.offset = Some(value);
89 self
90 }
91 pub fn size(mut self, value: u32) -> Self {
93 self.size = Some(value);
94 self
95 }
96 pub fn usage(mut self, value: AddressBlockUsage) -> Self {
98 self.usage = Some(value);
99 self
100 }
101 pub fn protection(mut self, value: Option<Protection>) -> Self {
103 self.protection = value;
104 self
105 }
106 pub fn build(self, lvl: ValidateLevel) -> Result<AddressBlock, SvdError> {
108 let de = AddressBlock {
109 offset: self
110 .offset
111 .ok_or_else(|| BuildError::Uninitialized("offset".to_string()))?,
112 size: self
113 .size
114 .ok_or_else(|| BuildError::Uninitialized("size".to_string()))?,
115 usage: self
116 .usage
117 .ok_or_else(|| BuildError::Uninitialized("usage".to_string()))?,
118 protection: self.protection,
119 };
120 de.validate(lvl)?;
121 Ok(de)
122 }
123}
124
125impl AddressBlock {
126 pub fn builder() -> AddressBlockBuilder {
128 AddressBlockBuilder::default()
129 }
130 pub fn modify_from(
132 &mut self,
133 builder: AddressBlockBuilder,
134 lvl: ValidateLevel,
135 ) -> Result<(), SvdError> {
136 if let Some(offset) = builder.offset {
137 self.offset = offset;
138 }
139 if let Some(size) = builder.size {
140 self.size = size;
141 }
142 if let Some(usage) = builder.usage {
143 self.usage = usage;
144 }
145 if builder.protection.is_some() {
146 self.protection = builder.protection;
147 }
148 self.validate(lvl)
149 }
150 pub fn validate(&self, _lvl: ValidateLevel) -> Result<(), SvdError> {
156 Ok(())
157 }
158}