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}