quickfix_spec_parser/model/
field_value.rs

1use std::io;
2
3use quick_xml::events::Event;
4
5use crate::{
6    Component, Field, FixSpecError, Group, XmlObject, XmlReadable, XmlReader, XmlWritable,
7    XmlWriter,
8};
9
10/// Sub component possible value.
11#[derive(Debug, Clone)]
12pub enum FieldValue {
13    /// Sub component is a field.
14    Field(Field),
15    /// Sub component is a group.
16    Group(Group),
17    /// Sub component is a factorized component.
18    Component(Component),
19}
20
21impl FieldValue {
22    pub(crate) fn parse_xml_tree(
23        reader: &mut XmlReader,
24        end_tag: &str,
25    ) -> Result<Vec<Self>, FixSpecError> {
26        let mut values = Vec::new();
27
28        loop {
29            match reader.read_event()? {
30                Event::Empty(element) | Event::Start(element)
31                    if element.name().as_ref() == Field::TAG_NAME.as_bytes() =>
32                {
33                    values.push(Self::Field(Field::parse_xml_tree(&element, reader)?));
34                }
35                Event::Empty(element) | Event::Start(element)
36                    if element.name().as_ref() == Group::TAG_NAME.as_bytes() =>
37                {
38                    values.push(Self::Group(Group::parse_xml_tree(&element, reader)?));
39                }
40                Event::Empty(element) | Event::Start(element)
41                    if element.name().as_ref() == Component::TAG_NAME.as_bytes() =>
42                {
43                    values.push(Self::Component(Component::parse_xml_tree(
44                        &element, reader,
45                    )?));
46                }
47                Event::End(element) if element.name().as_ref() == end_tag.as_bytes() => {
48                    return Ok(values);
49                }
50                _ => {}
51            }
52        }
53    }
54}
55
56impl XmlWritable for FieldValue {
57    fn write_xml<'a>(&self, writer: &'a mut XmlWriter) -> io::Result<&'a mut XmlWriter> {
58        match self {
59            Self::Field(field) => field.write_xml(writer),
60            Self::Group(group) => group.write_xml(writer),
61            Self::Component(component) => component.write_xml(writer),
62        }
63    }
64}