spin_manifest/schema/
common.rs1use std::fmt::Display;
2
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6use wasm_pkg_common::{package::PackageRef, registry::Registry};
7
8#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
10#[serde(deny_unknown_fields)]
11pub struct Variable {
12 #[serde(default, skip_serializing_if = "is_false")]
14 pub required: bool,
15 #[serde(default, skip_serializing_if = "Option::is_none")]
17 pub default: Option<String>,
18 #[serde(default, skip_serializing_if = "is_false")]
20 pub secret: bool,
21}
22
23#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
25#[serde(deny_unknown_fields, untagged)]
26pub enum ComponentSource {
27 Local(String),
29 Remote {
31 url: String,
33 digest: String,
35 },
36 Registry {
38 #[schemars(with = "Option<String>")]
40 registry: Option<Registry>,
41 #[schemars(with = "String")]
43 package: PackageRef,
44 version: String,
46 },
47}
48
49impl Display for ComponentSource {
50 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51 match self {
52 ComponentSource::Local(path) => write!(f, "{path:?}"),
53 ComponentSource::Remote { url, digest } => write!(f, "{url:?} with digest {digest:?}"),
54 ComponentSource::Registry {
55 registry,
56 package,
57 version,
58 } => {
59 let registry_suffix = match registry {
60 None => "default registry".to_owned(),
61 Some(r) => format!("registry {r:?}"),
62 };
63 write!(f, "\"{package}@{version}\" from {registry_suffix}")
64 }
65 }
66 }
67}
68
69#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
71#[serde(deny_unknown_fields, untagged)]
72pub enum WasiFilesMount {
73 Pattern(String),
75 Placement {
77 source: String,
79 destination: String,
81 },
82}
83
84#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
86#[serde(deny_unknown_fields)]
87pub struct ComponentBuildConfig {
88 pub command: Commands,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
92 pub workdir: Option<String>,
93 #[serde(default, skip_serializing_if = "Vec::is_empty")]
95 pub watch: Vec<String>,
96}
97
98impl ComponentBuildConfig {
99 pub fn commands(&self) -> impl ExactSizeIterator<Item = &String> {
101 let as_vec = match &self.command {
102 Commands::Single(cmd) => vec![cmd],
103 Commands::Multiple(cmds) => cmds.iter().collect(),
104 };
105 as_vec.into_iter()
106 }
107}
108
109#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
111#[serde(untagged)]
112pub enum Commands {
113 Single(String),
115 Multiple(Vec<String>),
117}
118
119fn is_false(v: &bool) -> bool {
120 !*v
121}