1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use rpser::xml::BuildElement;
use xmltree::Element;

use {Page, PageSummary, Result, Space};

pub trait FromElement {
    fn from_element(element: Element) -> Result<Self>
    where
        Self: Sized;
}

impl FromElement for Space {
    fn from_element(element: Element) -> Result<Space> {
        Ok(Space {
            description: try!(element.get_at_path(&["description"])).text,
            home_page: try!(element.get_at_path(&["homePage"]).and_then(|e| e.as_long())),
            key: try!(element.get_at_path(&["key"]).and_then(|e| e.as_string())),
            name: try!(element.get_at_path(&["name"]).and_then(|e| e.as_string())),
            space_group: try!(element.get_at_path(&["name"])).text,
            space_type: try!(element.get_at_path(&["type"]).and_then(|e| e.as_string())),
            url: try!(element.get_at_path(&["url"]).and_then(|e| e.as_string())),
        })
    }
}

impl FromElement for Page {
    fn from_element(element: Element) -> Result<Page> {
        Ok(Page {
            id: try!(element.get_at_path(&["id"]).and_then(|e| e.as_long())),
            space: try!(element.get_at_path(&["space"]).and_then(|e| e.as_string())),
            parent_id: try!(element.get_at_path(&["parentId"]).and_then(|e| e.as_long())),
            title: try!(element.get_at_path(&["title"]).and_then(|e| e.as_string())),
            url: try!(element.get_at_path(&["url"]).and_then(|e| e.as_string())),
            version: try!(element.get_at_path(&["version"]).and_then(|e| e.as_int())),
            content: try!(element
                .get_at_path(&["content"])
                .and_then(|e| e.as_string())),
            created: try!(element
                .get_at_path(&["created"])
                .and_then(|e| e.as_datetime())),
            creator: try!(element
                .get_at_path(&["creator"])
                .and_then(|e| e.as_string())),
            modified: try!(element
                .get_at_path(&["modified"])
                .and_then(|e| e.as_datetime())),
            modifier: try!(element
                .get_at_path(&["modifier"])
                .and_then(|e| e.as_string())),
            home_page: try!(element
                .get_at_path(&["homePage"])
                .and_then(|e| e.as_boolean())),
            content_status: try!(element
                .get_at_path(&["contentStatus"])
                .and_then(|e| e.as_string())),
            current: try!(element
                .get_at_path(&["current"])
                .and_then(|e| e.as_boolean())),
        })
    }
}

impl FromElement for PageSummary {
    fn from_element(element: Element) -> Result<PageSummary> {
        Ok(PageSummary {
            id: try!(element.get_at_path(&["id"]).and_then(|e| e.as_long())),
            space: try!(element.get_at_path(&["space"]).and_then(|e| e.as_string())),
            parent_id: try!(element.get_at_path(&["parentId"]).and_then(|e| e.as_long())),
            title: try!(element.get_at_path(&["title"]).and_then(|e| e.as_string())),
            url: try!(element.get_at_path(&["url"]).and_then(|e| e.as_string())),
        })
    }
}