quickfix_spec_parser/model/
field_value.rs1use 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#[derive(Debug, Clone)]
12pub enum FieldValue {
13 Field(Field),
15 Group(Group),
17 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}