add(converter): support value under register, by inserting field during conversion

This commit is contained in:
Wataru Otsubo 2025-04-24 03:04:04 +09:00
parent b8d18b26fc
commit 27f2f75ee2

View file

@ -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,45 @@ 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 = 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 {