#![deny(
warnings,
missing_debug_implementations,
trivial_casts,
trivial_numeric_casts,
unsafe_code,
unstable_features,
unused_import_braces,
unused_qualifications,
unreachable_pub,
type_alias_bounds,
trivial_bounds,
mutable_transmutes,
invalid_value,
explicit_outlives_requirements,
deprecated,
clashing_extern_declarations,
clippy::expect_used,
clippy::explicit_deref_methods
)]
#![warn(clippy::cognitive_complexity)]
#![allow(
missing_docs,
clippy::large_enum_variant,
missing_copy_implementations,
clippy::missing_const_for_fn,
clippy::enum_variant_names,
clippy::exhaustive_enums,
clippy::exhaustive_structs
)]
#[cfg(feature = "config")]
pub(crate) mod conversions;
pub mod helpers;
pub(crate) mod parse;
use std::collections::HashMap;
use num_traits::FromPrimitive;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum WickConfig {
#[serde(rename = "wick/app@v1")]
AppConfiguration(AppConfiguration),
#[serde(rename = "wick/component@v1")]
ComponentConfiguration(ComponentConfiguration),
#[serde(rename = "wick/types@v1")]
TypesConfiguration(TypesConfiguration),
#[serde(rename = "wick/tests@v1")]
TestConfiguration(TestConfiguration),
#[serde(rename = "wick/lockdown@v1")]
LockdownConfiguration(LockdownConfiguration),
}
#[allow(unused)]
pub type LiquidTemplate = String;
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct AppConfiguration {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub package: Option<PackageDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub resources: Vec<ResourceBinding>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub import: Vec<ImportBinding>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub triggers: Vec<TriggerDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Metadata {
#[serde(default)]
pub version: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub authors: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub vendors: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub licenses: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub icon: Option<crate::v1::helpers::LocationReference>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PackageDefinition {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub files: Vec<crate::v1::helpers::Glob>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub registry: Option<RegistryDefinition>,
}
#[allow(non_snake_case)]
pub(crate) fn REGISTRY_DEFINITION_HOST() -> String {
"registry.candle.dev".to_owned()
}
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct RegistryDefinition {
#[serde(default = "REGISTRY_DEFINITION_HOST")]
#[serde(alias = "registry")]
pub host: String,
#[serde(default)]
pub namespace: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ResourceBinding {
pub name: String,
pub resource: ResourceDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ImportBinding {
pub name: String,
pub component: ImportDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum ResourceDefinition {
#[serde(rename = "wick/resource/tcpport@v1")]
TcpPort(TcpPort),
#[serde(rename = "wick/resource/udpport@v1")]
UdpPort(UdpPort),
#[serde(rename = "wick/resource/url@v1")]
Url(Url),
#[serde(rename = "wick/resource/volume@v1")]
Volume(Volume),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TcpPort {
#[serde(default)]
pub port: LiquidTemplate,
#[serde(default)]
pub address: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct UdpPort {
#[serde(default)]
pub port: LiquidTemplate,
#[serde(default)]
pub address: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Volume {
pub path: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Url {
pub url: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum TriggerDefinition {
#[serde(rename = "wick/trigger/cli@v1")]
CliTrigger(CliTrigger),
#[serde(rename = "wick/trigger/http@v1")]
HttpTrigger(HttpTrigger),
#[serde(rename = "wick/trigger/time@v1")]
TimeTrigger(TimeTrigger),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct CliTrigger {
#[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
#[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
pub operation: ComponentOperationExpression,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TimeTrigger {
pub schedule: Schedule,
#[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
#[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
pub operation: ComponentOperationExpression,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub payload: Vec<OperationInput>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct OperationInput {
pub name: String,
pub value: Value,
}
#[allow(non_snake_case)]
pub(crate) fn SCHEDULE_REPEAT() -> u16 {
0
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Schedule {
pub cron: String,
#[serde(default = "SCHEDULE_REPEAT")]
pub repeat: u16,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ComponentOperationExpression {
#[serde(deserialize_with = "crate::v1::parse::component_shortform")]
pub component: ComponentDefinition,
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct HttpTrigger {
pub resource: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub routers: Vec<HttpRouter>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum HttpRouter {
#[serde(rename = "wick/router/raw@v1")]
RawRouter(RawRouter),
#[serde(rename = "wick/router/rest@v1")]
RestRouter(RestRouter),
#[serde(rename = "wick/router/static@v1")]
StaticRouter(StaticRouter),
#[serde(rename = "wick/router/proxy@v1")]
ProxyRouter(ProxyRouter),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ProxyRouter {
pub path: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub middleware: Option<Middleware>,
pub url: String,
#[serde(default)]
pub strip_path: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct RestRouter {
pub path: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Tools>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub middleware: Option<Middleware>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub routes: Vec<Route>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub info: Option<Info>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Route {
#[serde(alias = "uri")]
pub sub_path: String,
#[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
#[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
pub operation: ComponentOperationExpression,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub methods: Vec<HttpMethod>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Tools {
#[serde(default)]
pub openapi: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Info {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub tos: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub contact: Option<Contact>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<License>,
#[serde(default)]
pub version: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<Documentation>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Documentation {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct License {
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Contact {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct StaticRouter {
pub path: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub middleware: Option<Middleware>,
pub volume: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub fallback: Option<String>,
#[serde(default)]
pub indexes: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct RawRouter {
pub path: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub middleware: Option<Middleware>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub codec: Option<Codec>,
#[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
#[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
pub operation: ComponentOperationExpression,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Middleware {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(deserialize_with = "crate::v1::parse::vec_component_operation")]
pub request: Vec<ComponentOperationExpression>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(deserialize_with = "crate::v1::parse::vec_component_operation")]
pub response: Vec<ComponentOperationExpression>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TypesConfiguration {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub types: Vec<TypeDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<OperationDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub package: Option<PackageDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TestConfiguration {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub cases: Vec<TestDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct LockdownConfiguration {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub resources: Vec<ResourceRestriction>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum ResourceRestriction {
#[serde(rename = "wick/resource/volume@v1")]
VolumeRestriction(VolumeRestriction),
#[serde(rename = "wick/resource/url@v1")]
UrlRestriction(UrlRestriction),
#[serde(rename = "wick/resource/tcpport@v1")]
TcpPortRestriction(TcpPortRestriction),
#[serde(rename = "wick/resource/udpport@v1")]
UdpPortRestriction(UdpPortRestriction),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct VolumeRestriction {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub components: Vec<String>,
pub allow: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct UrlRestriction {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub components: Vec<String>,
pub allow: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TcpPortRestriction {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub components: Vec<String>,
pub address: LiquidTemplate,
pub port: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct UdpPortRestriction {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub components: Vec<String>,
pub address: LiquidTemplate,
pub port: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ComponentConfiguration {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub package: Option<PackageDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option<HostConfig>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub resources: Vec<ResourceBinding>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub import: Vec<ImportBinding>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub types: Vec<TypeDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub requires: Vec<InterfaceBinding>,
pub component: ComponentKind,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tests: Vec<TestConfiguration>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct InterfaceBinding {
pub name: String,
pub interface: InterfaceDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct InterfaceDefinition {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub types: Vec<TypeDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<OperationDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct CompositeComponentConfiguration {
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<CompositeOperationDefinition>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub extends: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct WasmComponentConfiguration {
#[serde(rename = "ref")]
pub reference: crate::v1::helpers::LocationReference,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub volumes: Vec<ExposedVolume>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_packet_size: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<OperationDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ExposedVolume {
pub resource: String,
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum ComponentKind {
#[serde(rename = "wick/component/wasmrs@v1")]
WasmComponentConfiguration(WasmComponentConfiguration),
#[serde(rename = "wick/component/composite@v1")]
CompositeComponentConfiguration(CompositeComponentConfiguration),
#[serde(rename = "wick/component/sql@v1")]
SqlComponent(SqlComponent),
#[serde(rename = "wick/component/http@v1")]
HttpClientComponent(HttpClientComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum ImportDefinition {
#[serde(rename = "wick/component/types@v1")]
TypesComponent(TypesComponent),
#[serde(rename = "wick/component/manifest@v1")]
ManifestComponent(ManifestComponent),
#[serde(rename = "wick/component/sql@v1")]
SqlComponent(SqlComponent),
#[serde(rename = "wick/component/http@v1")]
HttpClientComponent(HttpClientComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum ComponentDefinition {
#[serde(rename = "wick/component/grpc@v1")]
GrpcUrlComponent(GrpcUrlComponent),
#[serde(rename = "wick/component/manifest@v1")]
ManifestComponent(ManifestComponent),
#[serde(rename = "wick/component/reference@v1")]
ComponentReference(ComponentReference),
#[serde(rename = "wick/component/sql@v1")]
SqlComponent(SqlComponent),
#[serde(rename = "wick/component/http@v1")]
HttpClientComponent(HttpClientComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TypesComponent {
#[serde(rename = "ref")]
pub reference: crate::v1::helpers::LocationReference,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub types: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ComponentReference {
pub id: String,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct HostConfig {
#[serde(default)]
pub allow_latest: bool,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub insecure_registries: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub rpc: Option<HttpConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct HttpConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub port: Option<u16>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub pem: Option<crate::v1::helpers::LocationReference>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<crate::v1::helpers::LocationReference>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub ca: Option<crate::v1::helpers::LocationReference>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct GrpcUrlComponent {
pub url: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ManifestComponent {
#[serde(rename = "ref")]
pub reference: crate::v1::helpers::LocationReference,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
#[serde(default)]
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[serde(deserialize_with = "crate::helpers::kv_deserializer")]
pub provide: HashMap<String, String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_packet_size: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct CompositeOperationDefinition {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub uses: Vec<OperationInstance>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(deserialize_with = "crate::v1::parse::vec_connection")]
pub flow: Vec<FlowExpression>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<CompositeOperationDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(untagged)]
pub enum FlowExpression {
#[serde(rename = "ConnectionDefinition")]
ConnectionDefinition(ConnectionDefinition),
#[serde(rename = "BlockExpression")]
BlockExpression(BlockExpression),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct BlockExpression {
#[serde(skip_serializing_if = "Vec::is_empty")]
#[serde(deserialize_with = "crate::v1::parse::vec_connection")]
pub expressions: Vec<FlowExpression>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(into = "String")]
#[serde(deny_unknown_fields)]
pub struct ConnectionDefinition {
pub from: ConnectionTargetDefinition,
pub to: ConnectionTargetDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ConnectionTargetDefinition {
pub instance: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub port: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct OperationDefinition {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<Field>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Field {
pub name: String,
#[serde(rename = "type")]
pub ty: TypeSignature,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, serde_with::DeserializeFromStr, Serialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(into = "String")]
#[serde(tag = "kind")]
pub enum TypeSignature {
#[serde(rename = "I8")]
I8(I8),
#[serde(rename = "I16")]
I16(I16),
#[serde(rename = "I32")]
I32(I32),
#[serde(rename = "I64")]
I64(I64),
#[serde(rename = "U8")]
U8(U8),
#[serde(rename = "U16")]
U16(U16),
#[serde(rename = "U32")]
U32(U32),
#[serde(rename = "U64")]
U64(U64),
#[serde(rename = "F32")]
F32(F32),
#[serde(rename = "F64")]
F64(F64),
#[serde(rename = "Bool")]
Bool(Bool),
#[serde(rename = "StringType")]
StringType(StringType),
#[serde(rename = "Optional")]
Optional(Optional),
#[serde(rename = "Datetime")]
Datetime(Datetime),
#[serde(rename = "Bytes")]
Bytes(Bytes),
#[serde(rename = "Custom")]
Custom(Custom),
#[serde(rename = "List")]
List(List),
#[serde(rename = "Map")]
Map(Map),
#[serde(rename = "Object")]
Object(Object),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct I8;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct I16;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct I32;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct I64;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct U8;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct U16;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct U32;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct U64;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct F32;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct F64;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Bool;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct StringType;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Datetime;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Bytes;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Custom {
#[serde(default)]
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Optional {
#[serde(rename = "type")]
pub ty: Box<TypeSignature>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct List {
#[serde(rename = "type")]
pub ty: Box<TypeSignature>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Map {
pub key: Box<TypeSignature>,
pub value: Box<TypeSignature>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Object;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(tag = "kind")]
pub enum TypeDefinition {
#[serde(rename = "wick/type/struct@v1")]
StructSignature(StructSignature),
#[serde(rename = "wick/type/enum@v1")]
EnumSignature(EnumSignature),
#[serde(rename = "wick/type/union@v1")]
UnionSignature(UnionSignature),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct StructSignature {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub fields: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct UnionSignature {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub types: Vec<TypeSignature>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct EnumSignature {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub variants: Vec<EnumVariant>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct EnumVariant {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub index: Option<u32>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct OperationInstance {
pub name: String,
#[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
#[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
pub operation: ComponentOperationExpression,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TestDefinition {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub operation: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub inherent: Option<InherentData>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
#[serde(default)]
#[serde(alias = "input")]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<PacketData>,
#[serde(default)]
#[serde(alias = "output")]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<TestPacketData>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct InherentData {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<u64>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(untagged)]
pub enum PacketData {
#[serde(rename = "SuccessPacket")]
SuccessPacket(SuccessPacket),
#[serde(rename = "ErrorPacket")]
ErrorPacket(ErrorPacket),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(untagged)]
pub enum TestPacketData {
#[serde(rename = "SuccessPacket")]
SuccessPacket(SuccessPacket),
#[serde(rename = "PacketAssertionDef")]
PacketAssertionDef(PacketAssertionDef),
#[serde(rename = "ErrorPacket")]
ErrorPacket(ErrorPacket),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct SuccessPacket {
pub name: String,
#[deprecated()]
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub flags: Option<PacketFlags>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub flag: Option<PacketFlag>,
#[serde(default)]
#[serde(alias = "data")]
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<liquid_json::LiquidJsonValue>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PacketAssertionDef {
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub assertions: Vec<PacketAssertion>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PacketAssertion {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
pub operator: AssertionOperator,
pub value: liquid_json::LiquidJsonValue,
}
#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(deny_unknown_fields)]
pub enum AssertionOperator {
Equals = 0,
LessThan = 1,
GreaterThan = 2,
Regex = 3,
Contains = 4,
}
impl Default for AssertionOperator {
fn default() -> Self {
Self::from_u16(0).unwrap()
}
}
impl FromPrimitive for AssertionOperator {
fn from_i64(n: i64) -> Option<Self> {
Some(match n {
0 => Self::Equals,
1 => Self::LessThan,
2 => Self::GreaterThan,
3 => Self::Regex,
4 => Self::Contains,
_ => {
return None;
}
})
}
fn from_u64(n: u64) -> Option<Self> {
Some(match n {
0 => Self::Equals,
1 => Self::LessThan,
2 => Self::GreaterThan,
3 => Self::Regex,
4 => Self::Contains,
_ => {
return None;
}
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ErrorPacket {
pub name: String,
#[deprecated()]
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub flags: Option<PacketFlags>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub flag: Option<PacketFlag>,
pub error: LiquidTemplate,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PacketFlags {
#[serde(default)]
pub done: bool,
#[serde(default)]
pub open: bool,
#[serde(default)]
pub close: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(deny_unknown_fields)]
pub enum PacketFlag {
Done = 0,
Open = 1,
Close = 2,
}
impl Default for PacketFlag {
fn default() -> Self {
Self::from_u16(0).unwrap()
}
}
impl FromPrimitive for PacketFlag {
fn from_i64(n: i64) -> Option<Self> {
Some(match n {
0 => Self::Done,
1 => Self::Open,
2 => Self::Close,
_ => {
return None;
}
})
}
fn from_u64(n: u64) -> Option<Self> {
Some(match n {
0 => Self::Done,
1 => Self::Open,
2 => Self::Close,
_ => {
return None;
}
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct SqlComponent {
#[serde(default)]
pub resource: String,
#[serde(default)]
pub tls: bool,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<SqlQueryKind>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(untagged)]
pub enum SqlQueryKind {
#[serde(rename = "SqlQueryOperationDefinition")]
SqlQueryOperationDefinition(SqlQueryOperationDefinition),
#[serde(rename = "SqlExecOperationDefinition")]
SqlExecOperationDefinition(SqlExecOperationDefinition),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct SqlQueryOperationDefinition {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<Field>,
pub query: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub arguments: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub on_error: Option<ErrorBehavior>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct SqlExecOperationDefinition {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub outputs: Vec<Field>,
pub exec: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub arguments: Vec<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub on_error: Option<ErrorBehavior>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(deny_unknown_fields)]
pub enum ErrorBehavior {
Ignore = 0,
Commit = 1,
Rollback = 2,
}
impl Default for ErrorBehavior {
fn default() -> Self {
Self::from_u16(0).unwrap()
}
}
impl FromPrimitive for ErrorBehavior {
fn from_i64(n: i64) -> Option<Self> {
Some(match n {
0 => Self::Ignore,
1 => Self::Commit,
2 => Self::Rollback,
_ => {
return None;
}
})
}
fn from_u64(n: u64) -> Option<Self> {
Some(match n {
0 => Self::Ignore,
1 => Self::Commit,
2 => Self::Rollback,
_ => {
return None;
}
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct HttpClientComponent {
#[serde(default)]
pub resource: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub codec: Option<Codec>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub operations: Vec<HttpClientOperationDefinition>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct HttpClientOperationDefinition {
#[serde(default)]
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub with: Vec<Field>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub inputs: Vec<Field>,
#[serde(default)]
pub method: HttpMethod,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub codec: Option<Codec>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, Vec<String>>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<liquid_json::LiquidJsonValue>,
#[serde(default)]
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(deny_unknown_fields)]
pub enum Codec {
Json = 0,
Raw = 1,
FormData = 2,
Text = 3,
}
impl Default for Codec {
fn default() -> Self {
Self::from_u16(0).unwrap()
}
}
impl FromPrimitive for Codec {
fn from_i64(n: i64) -> Option<Self> {
Some(match n {
0 => Self::Json,
1 => Self::Raw,
2 => Self::FormData,
3 => Self::Text,
_ => {
return None;
}
})
}
fn from_u64(n: u64) -> Option<Self> {
Some(match n {
0 => Self::Json,
1 => Self::Raw,
2 => Self::FormData,
3 => Self::Text,
_ => {
return None;
}
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(deny_unknown_fields)]
pub enum HttpMethod {
Get = 0,
Post = 1,
Put = 2,
Delete = 3,
}
impl Default for HttpMethod {
fn default() -> Self {
Self::from_u16(0).unwrap()
}
}
impl FromPrimitive for HttpMethod {
fn from_i64(n: i64) -> Option<Self> {
Some(match n {
0 => Self::Get,
1 => Self::Post,
2 => Self::Put,
3 => Self::Delete,
_ => {
return None;
}
})
}
fn from_u64(n: u64) -> Option<Self> {
Some(match n {
0 => Self::Get,
1 => Self::Post,
2 => Self::Put,
3 => Self::Delete,
_ => {
return None;
}
})
}
}