Skip to main content

serde_appxmanifest/
lib.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Deserialize, Serialize)]
4#[serde(rename = "Package")]
5pub struct Package {
6    #[serde(rename = "Identity")]
7    pub identity: Identity,
8    #[serde(rename = "Properties")]
9    pub properties: Properties,
10    #[serde(rename = "Dependencies")]
11    pub dependencies: Dependencies,
12    // FIXME: duplicate field `rescap:Capability`
13    // #[serde(rename = "Capabilities")]
14    // capabilities: Vec<Capabilities>,
15    #[serde(rename = "Applications")]
16    pub applications: Applications,
17}
18
19#[derive(Debug, Deserialize, Serialize)]
20pub struct Identity {
21    #[serde(rename = "@Name")]
22    pub name: String,
23    #[serde(rename = "@ProcessorArchitecture")]
24    pub processor_architecture: Option<String>,
25    #[serde(rename = "@Publisher")]
26    pub publisher: String,
27    #[serde(rename = "@Version")]
28    pub version: String,
29}
30
31#[derive(Debug, Deserialize, Serialize)]
32pub struct Properties {
33    #[serde(rename = "DisplayName")]
34    pub display_name: String,
35    #[serde(rename = "PublisherDisplayName")]
36    pub publisher_display_name: String,
37    #[serde(rename = "Logo")]
38    pub logo: String,
39    #[serde(rename = "uap10:AllowExternalContent")]
40    pub allow_external_content: Option<bool>,
41}
42
43#[derive(Debug, Deserialize, Serialize)]
44pub struct Dependencies {
45    #[serde(rename = "TargetDeviceFamily")]
46    pub target_device_family: Vec<TargetDeviceFamily>,
47}
48
49#[derive(Debug, Deserialize, Serialize)]
50pub struct TargetDeviceFamily {
51    #[serde(rename = "@Name")]
52    pub name: String,
53    #[serde(rename = "@MinVersion")]
54    pub min_version: String,
55    #[serde(rename = "@MaxVersionTested")]
56    pub max_version_tested: String,
57}
58
59#[derive(Debug, Deserialize, Serialize)]
60pub struct Capabilities {
61    #[serde(rename = "rescap:Capability")]
62    pub capability: Vec<Capability>,
63}
64
65#[derive(Debug, Deserialize, Serialize)]
66pub struct Capability {
67    #[serde(rename = "@Name")]
68    pub name: String,
69}
70
71#[derive(Debug, Deserialize, Serialize)]
72pub struct Applications {
73    #[serde(rename = "Application")]
74    pub application: Vec<Application>,
75}
76
77#[derive(Debug, Deserialize, Serialize)]
78pub struct Application {
79    #[serde(rename = "@Id")]
80    pub id: String,
81    #[serde(rename = "uap10:TrustLevel")]
82    pub trust_level: Option<String>,
83    #[serde(rename = "uap10:RuntimeBehavior")]
84    pub runtime_behavior: Option<String>,
85    #[serde(rename = "uap:VisualElements")]
86    pub visual_elements: VisualElements,
87    #[serde(rename = "Extensions")]
88    pub extensions: Option<Extensions>,
89}
90
91#[derive(Debug, Deserialize, Serialize)]
92pub struct VisualElements {
93    #[serde(rename = "@AppListEntry")]
94    pub app_list_entry: Option<String>,
95    #[serde(rename = "@DisplayName")]
96    pub display_name: String,
97    #[serde(rename = "@Description")]
98    pub description: String,
99    #[serde(rename = "@BackgroundColor")]
100    pub background_color: String,
101    #[serde(rename = "@Square150x150Logo")]
102    pub square_150x150_logo: String,
103    #[serde(rename = "@Square44x44Logo")]
104    pub square_44x44_logo: String,
105}
106#[derive(Debug, Deserialize, Serialize)]
107pub struct Extensions {
108    #[serde(rename = "desktop4:Extension")]
109    pub desktop_extension: Option<Vec<DesktopExtension>>,
110    #[serde(rename = "com:Extension")]
111    pub com_extension: Option<Vec<ComExtension>>,
112}
113
114#[derive(Debug, Deserialize, Serialize)]
115pub struct DesktopExtension {
116    #[serde(rename = "desktop4:FileExplorerContextMenus")]
117    pub file_explorer_context_menus: FileExplorerContextMenus,
118}
119
120#[derive(Debug, Deserialize, Serialize)]
121pub struct FileExplorerContextMenus {
122    #[serde(rename = "desktop5:ItemType")]
123    pub item_type: Vec<ItemType>,
124}
125
126#[derive(Debug, Deserialize, Serialize)]
127pub struct ItemType {
128    #[serde(rename = "@Type")]
129    pub ty: String,
130    #[serde(rename = "desktop5:Verb")]
131    pub verb: Verb,
132}
133
134#[derive(Debug, Deserialize, Serialize)]
135pub struct Verb {
136    #[serde(rename = "@Id")]
137    pub id: String,
138    #[serde(rename = "@Clsid")]
139    pub clsid: String,
140}
141
142#[derive(Debug, Deserialize, Serialize)]
143pub struct ComExtension {
144    #[serde(rename = "@Category")]
145    pub category: String,
146
147    #[serde(rename = "com:ComServer")]
148    pub com_server: Option<ComServer>,
149}
150
151#[derive(Debug, Deserialize, Serialize)]
152pub struct ComServer {
153    #[serde(rename = "com:SurrogateServer")]
154    pub surrogate_server: Option<SurrogateServer>,
155}
156
157#[derive(Debug, Deserialize, Serialize)]
158pub struct SurrogateServer {
159    #[serde(rename = "@DisplayName")]
160    pub display_name: String,
161    #[serde(rename = "com:Class")]
162    pub com_class: Vec<ComClass>,
163}
164
165#[derive(Debug, Deserialize, Serialize)]
166pub struct ComClass {
167    #[serde(rename = "@Id")]
168    pub id: String,
169    #[serde(rename = "@Path")]
170    pub path: String,
171    #[serde(rename = "@ThreadingModel")]
172    pub threading_model: String,
173}
174#[cfg(test)]
175mod test {
176    use serde_xml_rs::from_str;
177    use crate::Package;
178
179    #[test]
180    fn test_xml() {
181        for i in std::fs::read_dir("assets/xml").unwrap() {
182            let xml = std::fs::read_to_string(i.unwrap().path()).unwrap();
183            let package = from_str::<Package>(&xml).unwrap();
184            assert!(!package.identity.name.is_empty());
185        }
186    }
187}