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
use quick_xml::de::from_str;
use serde::{Deserialize, Serialize};
use crate::xml::XdebugError;

#[derive(Debug, Serialize, Deserialize)]
pub enum ContextGet {
    Success(Success),
    Error(Error),
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Success {
    #[serde(rename = "@command")]
    pub command: String,
    #[serde(rename = "@transaction_id")]
    pub transaction_id: i32,
    #[serde(rename = "@context")]
    pub context: i32,
    pub property: Option<Vec<Property>>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Property {
    #[serde(rename = "@name")]
    pub name: Option<String>,
    #[serde(rename = "@fullname")]
    pub fullname: Option<String>,
    #[serde(rename = "@classname")]
    pub classname: Option<String>,
    #[serde(rename = "@page")]
    pub page: Option<i32>,
    #[serde(rename = "@pagesize")]
    pub pagesize: Option<i32>,
    #[serde(rename = "@type")]
    pub type_: String,
    #[serde(rename = "@facet")]
    pub facet: Option<String>,
    #[serde(rename = "@size")]
    pub size: Option<i32>,
    #[serde(rename = "@children")]
    pub children: Option<bool>,
    #[serde(rename = "@numchildren")]
    pub numchildren: Option<i32>,
    #[serde(rename = "@key")]
    pub key: Option<String>,
    #[serde(rename = "@address")]
    pub address: Option<String>,
    #[serde(rename = "@encoding")]
    pub encoding: Option<String>,
    pub property: Option<Vec<Property>>,
    #[serde(rename = "$text")]
    pub content: Option<String>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Error {
    #[serde(rename = "@command")]
    pub command: String,
    #[serde(rename = "@transaction_id")]
    pub transaction_id: i32,
    error: XdebugError,
}

impl ContextGet {
    pub fn from_str(str: &str) -> ContextGet {
        if let Ok(response) = from_str(str) {
            return ContextGet::Success(response);
        }

        ContextGet::Error(from_str(str).unwrap())
    }
}