Skip to content

Commit 3faecde

Browse files
committed
Added support for all element.
1 parent d8dd37e commit 3faecde

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

xsd-parser/src/parser/all.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use std::cell::RefCell;
2+
3+
use roxmltree::Node;
4+
5+
use crate::parser::node_parser::parse_node;
6+
use crate::parser::types::{RsEntity, Struct, StructField, TypeModifier};
7+
use crate::parser::utils::{enum_to_field, get_documentation, get_parent_name};
8+
use crate::parser::xsd_elements::{ElementType, XsdNode};
9+
10+
pub fn parse_all(node: &Node, parent: &Node) -> RsEntity {
11+
let name = get_parent_name(node);
12+
RsEntity::Struct(Struct {
13+
name: name.into(),
14+
comment: get_documentation(parent),
15+
subtypes: vec![],
16+
fields: RefCell::new(elements_to_fields(node, name)),
17+
..Default::default()
18+
})
19+
}
20+
21+
fn elements_to_fields(choice: &Node, parent_name: &str) -> Vec<StructField> {
22+
choice
23+
.children()
24+
.filter(|n| n.is_element() && n.xsd_type() != ElementType::Annotation)
25+
.map(|n| match parse_node(&n, choice) {
26+
RsEntity::StructField(mut sf) => {
27+
if sf.type_name.ends_with(parent_name) {
28+
sf.type_modifiers.push(TypeModifier::Recursive)
29+
}
30+
sf
31+
}
32+
RsEntity::Enum(mut en) => {
33+
en.name = format!("{}Choice", parent_name);
34+
enum_to_field(en)
35+
}
36+
_ => unreachable!("\nError: {:?}\n{:?}", n, parse_node(&n, choice)),
37+
})
38+
.collect()
39+
}

xsd-parser/src/parser/element.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const SUPPORTED_CONTENT_TYPES: [ElementType; 2] =
1414
pub fn parse_element(node: &Node, parent: &Node) -> RsEntity {
1515
match parent.xsd_type() {
1616
ElementType::Schema => parse_global_element(node),
17+
ElementType::All => parse_field_of_sequence(node, parent),
1718
ElementType::Sequence => parse_field_of_sequence(node, parent),
1819
ElementType::Choice => parse_case_of_choice(node),
1920
_ => element_default(node),

xsd-parser/src/parser/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod any;
2+
mod all;
23
mod any_attribute;
34
mod attribute;
45
mod attribute_group;

xsd-parser/src/parser/node_parser.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use roxmltree::Node;
22

3+
use crate::parser::all::parse_all;
34
use crate::parser::any::parse_any;
45
use crate::parser::any_attribute::parse_any_attribute;
56
use crate::parser::attribute::parse_attribute;
@@ -23,6 +24,7 @@ pub fn parse_node(node: &Node, parent: &Node) -> RsEntity {
2324
use ElementType::*;
2425

2526
match node.xsd_type() {
27+
All => parse_all(node, parent),
2628
Any => parse_any(node),
2729
AnyAttribute => parse_any_attribute(node),
2830
Attribute => parse_attribute(node, parent),

0 commit comments

Comments
 (0)