mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-05-10 13:35:57 +09:00
Merge branch 'fix-value-under-register' into 'main'
Support value under register, by inserting field during conversion Closes #3 See merge request wotsubo/endcap-sl-software-ri-generator!18
This commit is contained in:
commit
ab9fff5e9e
2 changed files with 58 additions and 5 deletions
|
@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
- Packagin with Nix flakes (with nixpkgs buildRustPackage) [!16](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/16)
|
- Packagin with Nix flakes (with nixpkgs buildRustPackage) [!16](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/16)
|
||||||
- Now xml metadata can be overwritten with corresponding environmental variables. [!17](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/17)
|
- Now xml metadata can be overwritten with corresponding environmental variables. [!17](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/17)
|
||||||
|
- Support value element just under the register element by inserting single field during conversion. [!3](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/18)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|
|
@ -389,11 +389,19 @@ impl Register {
|
||||||
.transpose()?;
|
.transpose()?;
|
||||||
let desc = node.attribute("desc").map(str::to_string);
|
let desc = node.attribute("desc").map(str::to_string);
|
||||||
|
|
||||||
let children: Vec<_> = node
|
let children: Vec<_> = {
|
||||||
.children()
|
let mut child_elements = node.children().filter(|node| node.is_element());
|
||||||
.filter(|node| node.is_element() && node.tag_name().name().eq("field"))
|
if child_elements.any(|node| node.tag_name().name().eq("value")) {
|
||||||
.map(Field::from_xml_dom)
|
// Generate virtual single field under the register, to absorb difference between
|
||||||
.collect::<Result<_, _>>()?;
|
// normal format
|
||||||
|
vec![Field::from_xml_register_dom(node)?]
|
||||||
|
} else {
|
||||||
|
child_elements
|
||||||
|
.filter(|node| node.tag_name().name().eq("field"))
|
||||||
|
.map(Field::from_xml_dom)
|
||||||
|
.collect::<Result<_, _>>()?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Validation
|
// Validation
|
||||||
if default.is_some() && !children.is_empty() {
|
if default.is_some() && !children.is_empty() {
|
||||||
|
@ -505,6 +513,50 @@ impl Field {
|
||||||
elements: children,
|
elements: children,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Generate Field from Registers (piracy), guessing a lot of parameters.
|
||||||
|
pub(crate) fn from_xml_register_dom(node: Node) -> Result<Self, DomConversionError> {
|
||||||
|
let name = util::get_name(node)?;
|
||||||
|
let mask = match node.attribute("mask") {
|
||||||
|
Some(mask) => mask
|
||||||
|
.parse_prefixed_u32()
|
||||||
|
.map_err(|e| DomConversionError::parse_prefixed_u32_error(e, "mask", node))?,
|
||||||
|
None => node
|
||||||
|
.ancestors()
|
||||||
|
.filter_map(|node| util::get_type(node))
|
||||||
|
.next()
|
||||||
|
.transpose()?
|
||||||
|
.map_or_else(
|
||||||
|
|| Err(DomConversionError::parameter_completion_error("type", node)),
|
||||||
|
|dtype| match dtype {
|
||||||
|
crate::types::DataType::D32 => Ok(u32::MAX),
|
||||||
|
},
|
||||||
|
)?,
|
||||||
|
};
|
||||||
|
if node.has_attribute("default") {
|
||||||
|
return Err(DomConversionError::other_error(
|
||||||
|
"unsupported structure: register with @default without field",
|
||||||
|
node,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let desc = node.attribute("desc").map(str::to_string);
|
||||||
|
let children = node
|
||||||
|
.children()
|
||||||
|
.filter(|node| node.is_element())
|
||||||
|
.map(Value::from_xml_dom)
|
||||||
|
.collect::<Result<_, _>>()?;
|
||||||
|
|
||||||
|
Ok(Field {
|
||||||
|
name,
|
||||||
|
mask,
|
||||||
|
interface: None,
|
||||||
|
multiple: None,
|
||||||
|
default: None,
|
||||||
|
sclr: None,
|
||||||
|
desc,
|
||||||
|
elements: children,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Value {
|
impl Value {
|
||||||
|
|
Loading…
Add table
Reference in a new issue