use serde::Deserialize;
mod raw {
use serde::Deserialize;
#[derive(Deserialize)]
pub struct VolumeIndex {
#[serde(rename = "Index")]
pub index: u32,
}
}
#[derive(Debug, thiserror::Error)]
pub enum VolindexError {
#[error("XML parse error: {0}")]
Xml(#[from] quick_xml::DeError),
}
#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))]
#[derive(Debug, serde::Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "typescript", derive(ts_rs::TS))]
#[cfg_attr(feature = "typescript", ts(export, rename_all = "camelCase"))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
pub struct VolumeIndex {
pub index: u32,
}
pub fn parse_volindex(xml_content: &str) -> Result<VolumeIndex, VolindexError> {
let raw: raw::VolumeIndex = quick_xml::de::from_str(xml_content)?;
Ok(VolumeIndex { index: raw.index })
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
#[test]
fn volindex_parses_index_element() {
let xml = r#"<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<VolumeIndex xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM">
<Index>1</Index>
</VolumeIndex>"#;
let result = parse_volindex(xml).unwrap();
assert_eq!(result.index, 1);
}
#[test]
fn volindex_parses_multi_volume() {
let xml = r#"<VolumeIndex xmlns="http://www.smpte-ra.org/ns/2067-9/2020">
<Index>3</Index>
</VolumeIndex>"#;
let result = parse_volindex(xml).unwrap();
assert_eq!(result.index, 3);
}
#[test]
fn volindex_rejects_malformed_xml() {
assert!(parse_volindex("<not-closed").is_err());
}
}