Skip to content

Commit d5379fc

Browse files
authored
Merge pull request #263 from rust-embedded/ignore-fields
ignore support in modify_field and derive
2 parents ac0c9ff + dcaf59e commit d5379fc

File tree

2 files changed

+53
-24
lines changed

2 files changed

+53
-24
lines changed

src/patch/peripheral.rs

+20-8
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,11 @@ pub(crate) trait RegisterBlockExt: Name {
247247
/// Remove fields from rname and mark it as derivedFrom rderive.
248248
/// Update all derivedFrom referencing rname
249249
fn derive_register(&mut self, rspec: &str, rderive: &Yaml, bpath: &BlockPath) -> PatchResult {
250-
let (rderive, info) = if let Some(rderive) = rderive.as_str() {
250+
let (rspec, ignore) = rspec.spec();
251+
let (rderive, dim, info) = if let Some(rderive) = rderive.as_str() {
251252
(
252253
rderive,
254+
None,
253255
RegisterInfo::builder().derived_from(Some(rderive.into())),
254256
)
255257
} else if let Some(hash) = rderive.as_hash() {
@@ -258,6 +260,7 @@ pub(crate) trait RegisterBlockExt: Name {
258260
})?;
259261
(
260262
rderive,
263+
make_dim_element(hash)?,
261264
make_register(hash, Some(bpath))?.derived_from(Some(rderive.into())),
262265
)
263266
} else {
@@ -277,15 +280,24 @@ pub(crate) trait RegisterBlockExt: Name {
277280
})?;
278281
}
279282

283+
let rtags = self.iter_registers(rspec).collect::<Vec<_>>();
280284
let mut found = Vec::new();
281-
for register in self.iter_registers(rspec) {
282-
found.push(register.name.to_string());
283-
register.modify_from(info.clone(), VAL_LVL)?;
284-
}
285-
if found.is_empty() {
285+
if !rtags.is_empty() {
286+
for rtag in rtags {
287+
found.push(rtag.name.to_string());
288+
modify_dim_element(rtag, &dim)?;
289+
rtag.modify_from(info.clone(), VAL_LVL)?;
290+
}
291+
} else if !ignore {
286292
super::check_dimable_name(rspec)?;
287-
let register = info.name(rspec.into()).build(VAL_LVL)?.single();
288-
self.add_child(RegisterCluster::Register(register));
293+
let reg = info.name(rspec.into()).build(VAL_LVL)?;
294+
self.add_child(RegisterCluster::Register({
295+
if let Some(dim) = dim {
296+
reg.array(dim.build(VAL_LVL)?)
297+
} else {
298+
reg.single()
299+
}
300+
}));
289301
}
290302
for rname in found {
291303
for r in self

src/patch/register.rs

+33-16
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,16 @@ impl RegisterExt for Register {
289289
}
290290

291291
fn modify_field(&mut self, fspec: &str, fmod: &Hash, rpath: &RegisterPath) -> PatchResult {
292+
let (fspec, ignore) = fspec.spec();
292293
let ftags = self.iter_fields(fspec).collect::<Vec<_>>();
293294
let field_builder = make_field(fmod, Some(rpath))?;
294295
let dim = make_dim_element(fmod)?;
295-
if !ftags.is_empty() {
296+
if ftags.is_empty() && !ignore {
297+
let present = self.present_fields();
298+
return Err(anyhow!(
299+
"Could not find `{rpath}:{fspec}. Present fields: {present}.`"
300+
));
301+
} else {
296302
for ftag in ftags {
297303
modify_dim_element(ftag, &dim)?;
298304
if let Some(value) = fmod
@@ -362,28 +368,39 @@ impl RegisterExt for Register {
362368
dpath.into()
363369
}
364370
}
365-
let info = if let Some(dpath) = fderive.as_str() {
366-
FieldInfo::builder().derived_from(Some(make_path(dpath, rpath)))
371+
let (fspec, ignore) = fspec.spec();
372+
let (dim, info) = if let Some(dpath) = fderive.as_str() {
373+
(
374+
None,
375+
FieldInfo::builder().derived_from(Some(make_path(dpath, rpath))),
376+
)
367377
} else if let Some(hash) = fderive.as_hash() {
368378
let dpath = hash.get_str("_from")?.ok_or_else(|| {
369379
anyhow!("derive: source field not given, please add a _from field to {fspec}")
370380
})?;
371-
make_field(hash, Some(rpath))?.derived_from(Some(make_path(dpath, rpath)))
381+
(
382+
make_dim_element(hash)?,
383+
make_field(hash, Some(rpath))?.derived_from(Some(make_path(dpath, rpath))),
384+
)
372385
} else {
373386
return Err(anyhow!("derive: incorrect syntax for {fspec}"));
374387
};
375-
376-
let mut found = false;
377-
for field in self.iter_fields(fspec) {
378-
found = true;
379-
field.modify_from(info.clone(), VAL_LVL)?;
380-
}
381-
if !found {
382-
{
383-
super::check_dimable_name(fspec)?;
384-
let field = info.name(fspec.into()).build(VAL_LVL)?.single();
385-
self.fields.get_or_insert(Vec::new()).push(field);
386-
}
388+
let ftags = self.iter_fields(fspec).collect::<Vec<_>>();
389+
if !ftags.is_empty() {
390+
for ftag in ftags {
391+
modify_dim_element(ftag, &dim)?;
392+
ftag.modify_from(info.clone(), VAL_LVL)?;
393+
}
394+
} else if !ignore {
395+
super::check_dimable_name(fspec)?;
396+
let field = info.name(fspec.into()).build(VAL_LVL)?;
397+
self.fields.get_or_insert(Vec::new()).push({
398+
if let Some(dim) = dim {
399+
field.array(dim.build(VAL_LVL)?)
400+
} else {
401+
field.single()
402+
}
403+
});
387404
}
388405
Ok(())
389406
}

0 commit comments

Comments
 (0)