Remove custom XML parsing

This commit is contained in:
Igor Katson 2024-08-27 18:10:52 +01:00
parent a825115472
commit 31a254103c
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
4 changed files with 46 additions and 23 deletions

View file

@ -2,32 +2,44 @@ pub mod content_directory {
use response::ItemOrContainer;
pub mod request {
use anyhow::Context;
use serde::Deserialize;
#[derive(Deserialize)]
struct Envelope {
#[serde(rename = "Body")]
body: Body,
}
#[derive(Deserialize)]
struct Body {
#[serde(rename = "Browse")]
browse: ContentDirectoryControlRequest,
}
#[derive(Deserialize, PartialEq, Eq, Debug)]
pub enum BrowseFlag {
BrowseDirectChildren,
BrowseMetadata,
}
#[derive(Deserialize, Debug)]
pub struct ContentDirectoryControlRequest {
#[serde(rename = "ObjectID")]
pub object_id: usize,
#[serde(rename = "BrowseFlag")]
pub browse_flag: BrowseFlag,
#[serde(rename = "StartingIndex", default)]
pub starting_index: usize,
#[serde(rename = "RequestedCount", default)]
pub requested_count: usize,
}
impl ContentDirectoryControlRequest {
pub fn parse(s: &str) -> anyhow::Result<Self> {
let mut reader = quick_xml::Reader::from_str(s);
use quick_xml::events::Event::{Eof, Start};
let mut object_id: Option<usize> = None;
loop {
match reader.read_event()? {
Eof => break,
Start(e) if e.name().as_ref() == b"ObjectID" => {
let t = reader.read_text(e.to_end().name())?;
object_id = t.trim().parse().ok();
}
_ => continue,
}
}
Ok(ContentDirectoryControlRequest {
object_id: object_id.unwrap_or(0),
})
let envelope: Envelope =
quick_xml::de::from_str(s).context("error deserializing")?;
Ok(envelope.body.browse)
}
}
}
@ -70,12 +82,15 @@ pub mod content_directory {
#[cfg(test)]
mod tests {
use crate::upnp_types::content_directory::request::ContentDirectoryControlRequest;
use crate::upnp_types::content_directory::request::{
BrowseFlag, ContentDirectoryControlRequest,
};
#[test]
fn test_parse_content_directory_request() {
let s = include_str!("resources/test/ContentDirectoryControlExampleRequest.xml");
let req = ContentDirectoryControlRequest::parse(s).unwrap();
assert_eq!(req.object_id, 5);
assert_eq!(req.browse_flag, BrowseFlag::BrowseDirectChildren)
}
}