edge-schema 0.1.0

Shared schema types for Wasmer Edge.
Documentation
//! This module holds schema defintions for Deploy configurations and other types.

mod app;
mod app_config;
mod app_version;
mod capability;
mod cpu;
mod cron;
mod dns;
mod entity;
mod fs;
mod http_router;
mod ip_blacklist;
mod job;
mod locality;
mod logging;
mod memory;
mod network;
mod network_dns;
mod network_gateway;
mod package;
mod tokens;
mod wasi;
mod web_gateway;
mod webc;
mod workload;

pub use self::{
    app::*, app_config::*, app_version::*, capability::*, cpu::*, cron::*, dns::*, entity::*,
    fs::*, http_router::*, ip_blacklist::*, job::*, locality::*, logging::*, memory::*, network::*,
    network_dns::*, network_gateway::*, package::*, tokens::*, wasi::*, web_gateway::*, webc::*,
    workload::*,
};

/// Extend values with defaults.
pub trait Merge {
    /// Extend `self` with values provided by `other`.
    ///
    /// Values on `self` should take precedence over `other`.
    fn merge_extend(self, other: &Self) -> Self;
}

impl<T> Merge for Option<T>
where
    T: Merge + Clone,
{
    fn merge_extend(self, other: &Self) -> Self {
        match (self, other) {
            (Some(s), Some(o)) => Some(s.merge_extend(o)),
            (None, Some(o)) => Some(o.clone()),
            (Some(s), None) => Some(s),
            (None, None) => None,
        }
    }
}

impl<T> Merge for Vec<T>
where
    T: Merge + PartialEq + Eq + Clone,
{
    fn merge_extend(mut self, other: &Self) -> Self {
        for o in other {
            if !self.contains(o) {
                self.push(o.clone());
            }
        }
        self
    }
}

#[derive(
    serde::Serialize, serde::Deserialize, PartialEq, Eq, Clone, Debug, schemars::JsonSchema,
)]
#[serde(tag = "kind")]
pub enum AnyEntity {
    #[serde(rename = "wasmer.io/App.v1")]
    AppV1(AppV1),
    #[serde(rename = "wasmer.io/HttpRouter.v1")]
    HttpRouterV1(HttpRouterV1),
}

/// Deserialize JSON to a given type using serde-path-to-error.
///
/// This provides better error locations on parsing failures.
pub fn deserialize_json<T>(
    input: &[u8],
) -> Result<T, serde_path_to_error::Error<serde_json::error::Error>>
where
    T: serde::de::DeserializeOwned,
{
    let jd = &mut serde_json::Deserializer::from_slice(input);
    serde_path_to_error::deserialize(jd)
}

macro_rules! impl_merge_primitive {
    ( $( $type:ty )* ) => {
        $(
            impl Merge for $type {
                fn merge_extend(self, _other: &Self) -> Self {
                    self
                }
            }
        )*
    };
}

impl_merge_primitive!(bool u16 u32 u64 i16 i32 i64 String uuid::Uuid bytesize::ByteSize);