use super::{PartGroup, ScorePart};
use alloc::{string::String, vec::Vec};
use musicxml_internal::*;
use musicxml_macros::*;
#[allow(clippy::large_enum_variant)]
#[derive(Debug, PartialEq, Eq)]
pub enum PartListElement {
PartGroup(PartGroup),
ScorePart(ScorePart),
}
#[derive(Debug, PartialEq, Eq)]
pub struct PartListContents {
pub content: Vec<PartListElement>,
}
impl ContentDeserializer for PartListContents {
fn deserialize(elements: &[XmlElement]) -> Result<Self, String> {
let mut content = PartListContents { content: Vec::new() };
for element in elements {
if element.name == "part-group" {
content
.content
.push(PartListElement::PartGroup(PartGroup::deserialize(element)?));
} else if element.name == "score-part" {
content
.content
.push(PartListElement::ScorePart(ScorePart::deserialize(element)?));
} else {
return Err(format!("Unexpected <part-list> element '{}'", element.name));
}
}
Ok(content)
}
}
impl ContentSerializer for PartListContents {
fn serialize(element: &Self) -> Vec<XmlElement> {
let mut elements: Vec<XmlElement> = Vec::new();
for el in &element.content {
match el {
PartListElement::PartGroup(el) => elements.push(PartGroup::serialize(el)),
PartListElement::ScorePart(el) => elements.push(ScorePart::serialize(el)),
}
}
elements
}
}
#[derive(Debug, PartialEq, Eq, ElementDeserialize, ElementSerialize)]
#[rename("part-list")]
pub struct PartList {
pub attributes: (),
#[flatten]
pub content: PartListContents,
}