Remove custom XML parsing
This commit is contained in:
parent
a825115472
commit
31a254103c
4 changed files with 46 additions and 23 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue