azure_storage_blobs/blob/
page_range_list.rs
1use azure_core::{prelude::Range, xml::read_xml_str};
2
3#[derive(Debug, Deserialize)]
4struct Start {
5 #[serde(rename = "$value")]
6 pub value: u64,
7}
8
9#[derive(Debug, Deserialize)]
10struct End {
11 #[serde(rename = "$value")]
12 pub value: u64,
13}
14
15#[derive(Debug, Deserialize)]
16struct PageRange {
17 #[serde(rename = "Start")]
18 pub start: Start,
19 #[serde(rename = "End")]
20 pub end: End,
21}
22
23#[derive(Debug, Deserialize)]
24struct PageList {
25 #[serde(rename = "PageRange", default)]
26 pub page_list: Vec<PageRange>,
27}
28
29#[derive(Default, Debug, Clone, PartialEq, Eq)]
30pub struct PageRangeList {
31 pub ranges: Vec<Range>,
32}
33
34impl PageRangeList {
35 pub fn try_from_xml(xml: &str) -> azure_core::Result<Self> {
36 let pl: PageList = read_xml_str(xml)?;
37
38 let mut prl = PageRangeList { ranges: Vec::new() };
39
40 for range in pl.page_list {
41 prl.ranges
42 .push(Range::new(range.start.value, range.end.value));
43 }
44
45 Ok(prl)
46 }
47}
48
49#[cfg(test)]
50mod test {
51 use super::*;
52
53 #[test]
54 fn try_parse() {
55 let page_list = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
56 <PageList>
57 <PageRange>
58 <Start>0</Start>
59 <End>511</End>
60 </PageRange>
61 <PageRange>
62 <Start>1024</Start>
63 <End>1535</End>
64 </PageRange>
65 </PageList> ";
66
67 let prl = PageRangeList::try_from_xml(page_list).unwrap();
68 assert!(prl.ranges.len() == 2);
69 assert!(prl.ranges[0] == Range::new(0, 511));
70 assert!(prl.ranges[1] == Range::new(1024, 1535));
71
72 let page_list = "<?xml version=\"1.0\" encoding=\"utf-8\"?><PageList></PageList>";
73 let prl = PageRangeList::try_from_xml(page_list).unwrap();
74 assert!(prl.ranges.is_empty());
75
76 let page_list = "<?xml version=\"1.0\" encoding=\"utf-8\"?><PageList />";
77 let prl = PageRangeList::try_from_xml(page_list).unwrap();
78 assert!(prl.ranges.is_empty());
79 }
80}