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