serde_appxmanifest/
lib.rs1use 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 #[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}