asimov_module/models/
manifest.rs1use alloc::{string::String, vec::Vec};
4
5#[derive(Clone, Debug, Default)]
6#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
7pub struct ModuleManifest {
8 pub name: String,
9 pub label: String,
10 pub summary: String,
11 pub links: Vec<String>,
12 #[cfg_attr(
13 feature = "serde",
14 serde(default, skip_serializing_if = "Provides::is_empty")
15 )]
16 pub provides: Provides,
17 #[cfg_attr(
18 feature = "serde",
19 serde(default, skip_serializing_if = "Handles::is_empty")
20 )]
21 pub handles: Handles,
22}
23
24#[derive(Clone, Debug, Default)]
25#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
26pub struct Provides {
27 pub programs: Vec<String>,
28}
29
30impl Provides {
31 pub fn is_empty(&self) -> bool {
32 self.programs.is_empty()
33 }
34}
35
36#[derive(Clone, Debug, Default)]
37#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
38pub struct Handles {
39 #[cfg_attr(
40 feature = "serde",
41 serde(default, skip_serializing_if = "Vec::is_empty")
42 )]
43 pub url_protocols: Vec<String>,
44 #[cfg_attr(
45 feature = "serde",
46 serde(default, skip_serializing_if = "Vec::is_empty")
47 )]
48 pub url_prefixes: Vec<String>,
49 #[cfg_attr(
50 feature = "serde",
51 serde(default, skip_serializing_if = "Vec::is_empty")
52 )]
53 pub url_patterns: Vec<String>,
54 #[cfg_attr(
55 feature = "serde",
56 serde(default, skip_serializing_if = "Vec::is_empty")
57 )]
58 pub file_extensions: Vec<String>,
59 #[cfg_attr(
60 feature = "serde",
61 serde(default, skip_serializing_if = "Vec::is_empty")
62 )]
63 pub content_types: Vec<String>,
64}
65
66impl Handles {
67 pub fn is_empty(&self) -> bool {
68 self.url_protocols.is_empty()
69 && self.url_prefixes.is_empty()
70 && self.url_patterns.is_empty()
71 && self.file_extensions.is_empty()
72 && self.content_types.is_empty()
73 }
74}