wasmer_deploy_schema/schema/
mod.rs

1//! This module holds schema defintions for Deploy configurations and other types.
2
3mod app;
4mod app_config;
5mod app_version;
6mod capability;
7mod cpu;
8mod entity;
9mod fs;
10mod http_router;
11mod ip_blacklist;
12mod logging;
13mod memory;
14mod network;
15mod network_dns;
16mod network_gateway;
17mod package;
18mod tokens;
19mod wasi;
20mod webc;
21mod workload;
22
23pub use self::{
24    app::*, app_config::*, app_version::*, capability::*, cpu::*, entity::*, fs::*, http_router::*,
25    ip_blacklist::*, logging::*, memory::*, network::*, network_dns::*, network_gateway::*,
26    package::*, tokens::*, wasi::*, webc::*, workload::*,
27};
28
29/// Extend values with defaults.
30pub trait Merge {
31    /// Extend `self` with values provided by `other`.
32    ///
33    /// Values on `self` should take precedence over `other`.
34    fn merge_extend(self, other: &Self) -> Self;
35}
36
37impl<T> Merge for Option<T>
38where
39    T: Merge + Clone,
40{
41    fn merge_extend(self, other: &Self) -> Self {
42        match (self, other) {
43            (Some(s), Some(o)) => Some(s.merge_extend(o)),
44            (None, Some(o)) => Some(o.clone()),
45            (Some(s), None) => Some(s),
46            (None, None) => None,
47        }
48    }
49}
50
51impl<T> Merge for Vec<T>
52where
53    T: Merge + PartialEq + Eq + Clone,
54{
55    fn merge_extend(mut self, other: &Self) -> Self {
56        for o in other {
57            if !self.contains(o) {
58                self.push(o.clone());
59            }
60        }
61        self
62    }
63}
64
65#[derive(
66    serde::Serialize, serde::Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema,
67)]
68#[serde(tag = "kind")]
69pub enum AnyEntity {
70    #[serde(rename = "wasmer.io/App.v1")]
71    AppV1(AppV1),
72    #[serde(rename = "wasmer.io/HttpRouter.v1")]
73    HttpRouterV1(HttpRouterV1),
74}
75
76/// Deserialize JSON to a given type using serde-path-to-error.
77///
78/// This provides better error locations on parsing failures.
79pub fn deserialize_json<T>(
80    input: &[u8],
81) -> Result<T, serde_path_to_error::Error<serde_json::error::Error>>
82where
83    T: serde::de::DeserializeOwned,
84{
85    let jd = &mut serde_json::Deserializer::from_slice(input);
86    serde_path_to_error::deserialize(jd)
87}
88
89macro_rules! impl_merge_primitive {
90    ( $( $type:ty )* ) => {
91        $(
92            impl Merge for $type {
93                fn merge_extend(self, _other: &Self) -> Self {
94                    self
95                }
96            }
97        )*
98    };
99}
100
101impl_merge_primitive!(bool u32 String uuid::Uuid bytesize::ByteSize);