1#![deny(
2 warnings,
3 missing_debug_implementations,
4 trivial_casts,
5 trivial_numeric_casts,
6 unsafe_code,
7 unstable_features,
8 unused_import_braces,
9 unused_qualifications,
10 unreachable_pub,
11 type_alias_bounds,
12 trivial_bounds,
13 mutable_transmutes,
14 invalid_value,
15 explicit_outlives_requirements,
16 deprecated,
17 clashing_extern_declarations,
18 clippy::expect_used,
19 clippy::explicit_deref_methods
20)]
21#![warn(clippy::cognitive_complexity)]
22#![allow(
23 missing_docs,
24 clippy::large_enum_variant,
25 missing_copy_implementations,
26 clippy::missing_const_for_fn,
27 clippy::enum_variant_names,
28 clippy::exhaustive_enums,
29 clippy::exhaustive_structs
30)]
31
32#[cfg(feature = "config")]
33pub(crate) mod conversions;
34pub mod helpers;
35pub(crate) mod parse;
36
37use std::collections::HashMap;
38
39use num_traits::FromPrimitive;
40use serde::{Deserialize, Serialize};
41use serde_json::Value;
42
43#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
44#[serde(deny_unknown_fields)]
45#[serde(tag = "kind")]
46pub enum WickConfig {
48 #[serde(rename = "wick/app@v1")]
50 AppConfiguration(AppConfiguration),
51 #[serde(rename = "wick/component@v1")]
53 ComponentConfiguration(ComponentConfiguration),
54 #[serde(rename = "wick/types@v1")]
56 TypesConfiguration(TypesConfiguration),
57 #[serde(rename = "wick/tests@v1")]
59 TestConfiguration(TestConfiguration),
60 #[serde(rename = "wick/lockdown@v1")]
62 LockdownConfiguration(LockdownConfiguration),
63}
64
65#[allow(unused)]
67pub type BoundIdentifier = String;
68
69#[allow(unused)]
71pub type LiquidTemplate = String;
72
73#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
74#[serde(deny_unknown_fields)]
75pub struct AppConfiguration {
77 pub name: String,
79 #[serde(default)]
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub metadata: Option<Metadata>,
84 #[serde(default)]
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub package: Option<PackageDefinition>,
89 #[serde(default)]
92 #[serde(skip_serializing_if = "Vec::is_empty")]
93 pub resources: Vec<ResourceBinding>,
94 #[serde(default)]
97 #[serde(skip_serializing_if = "Vec::is_empty")]
98 pub import: Vec<ImportBinding>,
99 #[serde(default)]
102 #[serde(skip_serializing_if = "Vec::is_empty")]
103 pub triggers: Vec<TriggerDefinition>,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
107#[serde(deny_unknown_fields)]
108pub struct Metadata {
110 #[serde(default)]
113 pub version: String,
114 #[serde(default)]
117 #[serde(skip_serializing_if = "Vec::is_empty")]
118 pub authors: Vec<String>,
119 #[serde(default)]
122 #[serde(skip_serializing_if = "Vec::is_empty")]
123 pub vendors: Vec<String>,
124 #[serde(default)]
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub description: Option<String>,
129 #[serde(default)]
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub documentation: Option<String>,
134 #[serde(default)]
137 #[serde(skip_serializing_if = "Vec::is_empty")]
138 pub licenses: Vec<String>,
139 #[serde(default)]
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub icon: Option<crate::v1::helpers::LocationReference>,
144}
145
146#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
147#[serde(deny_unknown_fields)]
148pub struct PackageDefinition {
150 #[serde(default)]
153 #[serde(skip_serializing_if = "Vec::is_empty")]
154 pub files: Vec<crate::v1::helpers::Glob>,
155 #[serde(default)]
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub registry: Option<RegistryDefinition>,
160}
161
162#[allow(non_snake_case)]
163pub(crate) fn REGISTRY_DEFINITION_HOST() -> String {
164 "registry.candle.dev".to_owned()
165}
166
167#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
168#[serde(deny_unknown_fields)]
169pub struct RegistryDefinition {
170 #[serde(default = "REGISTRY_DEFINITION_HOST")]
173 #[serde(alias = "registry")]
174 pub host: String,
175 #[serde(default)]
178 pub namespace: String,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
182#[serde(deny_unknown_fields)]
183pub struct ResourceBinding {
185 pub name: String,
187 pub resource: ResourceDefinition,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
192#[serde(deny_unknown_fields)]
193pub struct ImportBinding {
195 pub name: String,
197 pub component: ImportDefinition,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
202#[serde(deny_unknown_fields)]
203#[serde(tag = "kind")]
204pub enum ResourceDefinition {
206 #[serde(rename = "wick/resource/tcpport@v1")]
208 TcpPort(TcpPort),
209 #[serde(rename = "wick/resource/udpport@v1")]
211 UdpPort(UdpPort),
212 #[serde(rename = "wick/resource/url@v1")]
214 Url(Url),
215 #[serde(rename = "wick/resource/volume@v1")]
217 Volume(Volume),
218}
219
220#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
221#[serde(deny_unknown_fields)]
222pub struct TcpPort {
224 pub port: LiquidTemplate,
226 pub address: LiquidTemplate,
228}
229
230#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
231#[serde(deny_unknown_fields)]
232pub struct UdpPort {
234 pub port: LiquidTemplate,
236 pub address: LiquidTemplate,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
241#[serde(deny_unknown_fields)]
242pub struct Volume {
244 pub path: LiquidTemplate,
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
249#[serde(deny_unknown_fields)]
250pub struct Url {
252 pub url: LiquidTemplate,
254}
255
256#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
257#[serde(deny_unknown_fields)]
258#[serde(tag = "kind")]
259pub enum TriggerDefinition {
261 #[serde(rename = "wick/trigger/cli@v1")]
263 CliTrigger(CliTrigger),
264 #[serde(rename = "wick/trigger/http@v1")]
266 HttpTrigger(HttpTrigger),
267 #[serde(rename = "wick/trigger/time@v1")]
269 TimeTrigger(TimeTrigger),
270 #[serde(rename = "wick/trigger/wasm-command@v1")]
272 WasmCommandTrigger(WasmCommandTrigger),
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
276#[serde(deny_unknown_fields)]
277pub struct WasmCommandTrigger {
279 pub reference: crate::v1::helpers::LocationReference,
281 #[serde(default)]
284 #[serde(skip_serializing_if = "Vec::is_empty")]
285 pub volumes: Vec<ExposedVolume>,
286}
287
288#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
289#[serde(deny_unknown_fields)]
290pub struct CliTrigger {
292 #[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
295 #[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
296 pub operation: ComponentOperationExpression,
297}
298
299#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
300#[serde(deny_unknown_fields)]
301pub struct TimeTrigger {
303 pub schedule: Schedule,
305 #[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
308 #[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
309 pub operation: ComponentOperationExpression,
310 #[serde(skip_serializing_if = "Vec::is_empty")]
313 pub payload: Vec<OperationInput>,
314}
315
316#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
317#[serde(deny_unknown_fields)]
318pub struct OperationInput {
320 pub name: String,
322 pub value: Value,
324}
325
326#[allow(non_snake_case)]
327pub(crate) fn SCHEDULE_REPEAT() -> u16 {
328 0
329}
330
331#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
332#[serde(deny_unknown_fields)]
333pub struct Schedule {
335 pub cron: String,
337 #[serde(default = "SCHEDULE_REPEAT")]
340 pub repeat: u16,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
344#[serde(deny_unknown_fields)]
345pub struct ComponentOperationExpression {
347 #[serde(deserialize_with = "crate::v1::parse::component_shortform")]
350 pub component: ComponentDefinition,
351 pub name: String,
353 #[serde(default)]
356 #[serde(skip_serializing_if = "Option::is_none")]
357 pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
358 #[serde(default)]
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub timeout: Option<u64>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
366#[serde(deny_unknown_fields)]
367pub struct HttpTrigger {
369 pub resource: BoundIdentifier,
371 #[serde(default)]
374 #[serde(skip_serializing_if = "Vec::is_empty")]
375 pub routers: Vec<HttpRouter>,
376}
377
378#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
379#[serde(deny_unknown_fields)]
380#[serde(tag = "kind")]
381pub enum HttpRouter {
383 #[serde(rename = "wick/router/raw@v1")]
385 RawRouter(RawRouter),
386 #[serde(rename = "wick/router/rest@v1")]
388 RestRouter(RestRouter),
389 #[serde(rename = "wick/router/static@v1")]
391 StaticRouter(StaticRouter),
392 #[serde(rename = "wick/router/proxy@v1")]
394 ProxyRouter(ProxyRouter),
395}
396
397#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
398#[serde(deny_unknown_fields)]
399pub struct ProxyRouter {
401 pub path: String,
403 #[serde(default)]
406 #[serde(skip_serializing_if = "Option::is_none")]
407 pub middleware: Option<Middleware>,
408 pub url: BoundIdentifier,
410 #[serde(default)]
413 pub strip_path: bool,
414}
415
416#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
417#[serde(deny_unknown_fields)]
418pub struct RestRouter {
420 pub path: String,
422 #[serde(default)]
425 #[serde(skip_serializing_if = "Option::is_none")]
426 pub tools: Option<Tools>,
427 #[serde(default)]
430 #[serde(skip_serializing_if = "Option::is_none")]
431 pub middleware: Option<Middleware>,
432 #[serde(default)]
435 #[serde(skip_serializing_if = "Vec::is_empty")]
436 pub routes: Vec<Route>,
437 #[serde(default)]
440 #[serde(skip_serializing_if = "Option::is_none")]
441 pub info: Option<Info>,
442}
443
444#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
445#[serde(deny_unknown_fields)]
446pub struct Route {
448 #[serde(alias = "uri")]
451 pub sub_path: String,
452 #[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
455 #[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
456 pub operation: ComponentOperationExpression,
457 #[serde(default)]
460 #[serde(skip_serializing_if = "Vec::is_empty")]
461 pub methods: Vec<HttpMethod>,
462 #[serde(default)]
465 #[serde(skip_serializing_if = "Option::is_none")]
466 pub id: Option<String>,
467 #[serde(default)]
470 #[serde(skip_serializing_if = "Option::is_none")]
471 pub description: Option<String>,
472 #[serde(default)]
475 #[serde(skip_serializing_if = "Option::is_none")]
476 pub summary: Option<String>,
477}
478
479#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
480#[serde(deny_unknown_fields)]
481pub struct Tools {
483 #[serde(default)]
486 pub openapi: bool,
487}
488
489#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
490#[serde(deny_unknown_fields)]
491pub struct Info {
493 #[serde(default)]
496 #[serde(skip_serializing_if = "Option::is_none")]
497 pub title: Option<String>,
498 #[serde(default)]
501 #[serde(skip_serializing_if = "Option::is_none")]
502 pub description: Option<String>,
503 #[serde(default)]
506 #[serde(skip_serializing_if = "Option::is_none")]
507 pub tos: Option<String>,
508 #[serde(default)]
511 #[serde(skip_serializing_if = "Option::is_none")]
512 pub contact: Option<Contact>,
513 #[serde(default)]
516 #[serde(skip_serializing_if = "Option::is_none")]
517 pub license: Option<License>,
518 #[serde(default)]
521 pub version: String,
522 #[serde(default)]
525 #[serde(skip_serializing_if = "Option::is_none")]
526 pub documentation: Option<Documentation>,
527}
528
529#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
530#[serde(deny_unknown_fields)]
531pub struct Documentation {
533 #[serde(default)]
536 #[serde(skip_serializing_if = "Option::is_none")]
537 pub url: Option<String>,
538 #[serde(default)]
541 #[serde(skip_serializing_if = "Option::is_none")]
542 pub description: Option<String>,
543}
544
545#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
546#[serde(deny_unknown_fields)]
547pub struct License {
549 pub name: String,
551 #[serde(default)]
554 #[serde(skip_serializing_if = "Option::is_none")]
555 pub url: Option<String>,
556}
557
558#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
559#[serde(deny_unknown_fields)]
560pub struct Contact {
562 #[serde(default)]
565 #[serde(skip_serializing_if = "Option::is_none")]
566 pub name: Option<String>,
567 #[serde(default)]
570 #[serde(skip_serializing_if = "Option::is_none")]
571 pub url: Option<String>,
572 #[serde(default)]
575 #[serde(skip_serializing_if = "Option::is_none")]
576 pub email: Option<String>,
577}
578
579#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
580#[serde(deny_unknown_fields)]
581pub struct StaticRouter {
583 pub path: String,
585 #[serde(default)]
588 #[serde(skip_serializing_if = "Option::is_none")]
589 pub middleware: Option<Middleware>,
590 pub volume: String,
592 #[serde(default)]
595 #[serde(skip_serializing_if = "Option::is_none")]
596 pub fallback: Option<String>,
597 #[serde(default)]
600 pub indexes: bool,
601}
602
603#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
604#[serde(deny_unknown_fields)]
605pub struct RawRouter {
607 pub path: String,
609 #[serde(default)]
612 #[serde(skip_serializing_if = "Option::is_none")]
613 pub middleware: Option<Middleware>,
614 #[serde(default)]
617 #[serde(skip_serializing_if = "Option::is_none")]
618 pub codec: Option<Codec>,
619 #[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
622 #[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
623 pub operation: ComponentOperationExpression,
624}
625
626#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
627#[serde(deny_unknown_fields)]
628pub struct Middleware {
630 #[serde(default)]
633 #[serde(skip_serializing_if = "Vec::is_empty")]
634 #[serde(deserialize_with = "crate::v1::parse::vec_component_operation")]
635 pub request: Vec<ComponentOperationExpression>,
636 #[serde(default)]
639 #[serde(skip_serializing_if = "Vec::is_empty")]
640 #[serde(deserialize_with = "crate::v1::parse::vec_component_operation")]
641 pub response: Vec<ComponentOperationExpression>,
642}
643
644#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
645#[serde(deny_unknown_fields)]
646pub struct TypesConfiguration {
648 #[serde(default)]
651 #[serde(skip_serializing_if = "Option::is_none")]
652 pub name: Option<String>,
653 #[serde(default)]
656 #[serde(skip_serializing_if = "Option::is_none")]
657 pub metadata: Option<Metadata>,
658 #[serde(default)]
661 #[serde(skip_serializing_if = "Vec::is_empty")]
662 pub types: Vec<TypeDefinition>,
663 #[serde(default)]
666 #[serde(skip_serializing_if = "Vec::is_empty")]
667 pub operations: Vec<OperationDefinition>,
668 #[serde(default)]
671 #[serde(skip_serializing_if = "Option::is_none")]
672 pub package: Option<PackageDefinition>,
673}
674
675#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
676#[serde(deny_unknown_fields)]
677pub struct TestConfiguration {
679 #[serde(default)]
682 #[serde(skip_serializing_if = "Option::is_none")]
683 pub name: Option<String>,
684 #[serde(default)]
687 #[serde(skip_serializing_if = "Option::is_none")]
688 pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
689 #[serde(default)]
692 #[serde(skip_serializing_if = "Vec::is_empty")]
693 pub cases: Vec<TestDefinition>,
694}
695
696#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
697#[serde(deny_unknown_fields)]
698pub struct LockdownConfiguration {
700 #[serde(default)]
703 #[serde(skip_serializing_if = "Option::is_none")]
704 pub metadata: Option<Metadata>,
705 #[serde(default)]
708 #[serde(skip_serializing_if = "Vec::is_empty")]
709 pub resources: Vec<ResourceRestriction>,
710}
711
712#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
713#[serde(deny_unknown_fields)]
714#[serde(tag = "kind")]
715pub enum ResourceRestriction {
717 #[serde(rename = "wick/resource/volume@v1")]
719 VolumeRestriction(VolumeRestriction),
720 #[serde(rename = "wick/resource/url@v1")]
722 UrlRestriction(UrlRestriction),
723 #[serde(rename = "wick/resource/tcpport@v1")]
725 TcpPortRestriction(TcpPortRestriction),
726 #[serde(rename = "wick/resource/udpport@v1")]
728 UdpPortRestriction(UdpPortRestriction),
729}
730
731#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
732#[serde(deny_unknown_fields)]
733pub struct VolumeRestriction {
735 #[serde(default)]
738 #[serde(skip_serializing_if = "Vec::is_empty")]
739 pub components: Vec<String>,
740 pub allow: LiquidTemplate,
742}
743
744#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
745#[serde(deny_unknown_fields)]
746pub struct UrlRestriction {
748 #[serde(default)]
751 #[serde(skip_serializing_if = "Vec::is_empty")]
752 pub components: Vec<String>,
753 pub allow: LiquidTemplate,
755}
756
757#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
758#[serde(deny_unknown_fields)]
759pub struct TcpPortRestriction {
761 #[serde(default)]
764 #[serde(skip_serializing_if = "Vec::is_empty")]
765 pub components: Vec<String>,
766 pub address: LiquidTemplate,
768 pub port: LiquidTemplate,
770}
771
772#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
773#[serde(deny_unknown_fields)]
774pub struct UdpPortRestriction {
776 #[serde(default)]
779 #[serde(skip_serializing_if = "Vec::is_empty")]
780 pub components: Vec<String>,
781 pub address: LiquidTemplate,
783 pub port: LiquidTemplate,
785}
786
787#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
788#[serde(deny_unknown_fields)]
789pub struct ComponentConfiguration {
791 #[serde(default)]
794 #[serde(skip_serializing_if = "Option::is_none")]
795 pub name: Option<String>,
796 #[serde(default)]
799 #[serde(skip_serializing_if = "Option::is_none")]
800 pub metadata: Option<Metadata>,
801 #[serde(default)]
804 #[serde(skip_serializing_if = "Option::is_none")]
805 pub package: Option<PackageDefinition>,
806 #[serde(default)]
809 #[serde(skip_serializing_if = "Option::is_none")]
810 pub host: Option<HostConfig>,
811 #[serde(default)]
814 #[serde(skip_serializing_if = "Vec::is_empty")]
815 pub resources: Vec<ResourceBinding>,
816 #[serde(default)]
819 #[serde(skip_serializing_if = "Vec::is_empty")]
820 pub import: Vec<ImportBinding>,
821 #[serde(default)]
824 #[serde(skip_serializing_if = "Vec::is_empty")]
825 pub types: Vec<TypeDefinition>,
826 #[serde(default)]
829 #[serde(skip_serializing_if = "Vec::is_empty")]
830 pub requires: Vec<InterfaceBinding>,
831 pub component: ComponentKind,
833 #[serde(default)]
836 #[serde(skip_serializing_if = "Vec::is_empty")]
837 pub tests: Vec<TestConfiguration>,
838}
839
840#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
841#[serde(deny_unknown_fields)]
842pub struct InterfaceBinding {
844 pub name: String,
846 pub interface: InterfaceDefinition,
848}
849
850#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
851#[serde(deny_unknown_fields)]
852pub struct InterfaceDefinition {
854 #[serde(default)]
857 #[serde(skip_serializing_if = "Vec::is_empty")]
858 pub types: Vec<TypeDefinition>,
859 #[serde(default)]
862 #[serde(skip_serializing_if = "Vec::is_empty")]
863 pub operations: Vec<OperationDefinition>,
864}
865
866#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
867#[serde(deny_unknown_fields)]
868pub struct CompositeComponentConfiguration {
870 #[serde(default)]
873 #[serde(skip_serializing_if = "Vec::is_empty")]
874 pub operations: Vec<CompositeOperationDefinition>,
875 #[serde(default)]
878 #[serde(skip_serializing_if = "Vec::is_empty")]
879 pub with: Vec<Field>,
880 #[serde(default)]
883 #[serde(skip_serializing_if = "Vec::is_empty")]
884 pub extends: Vec<String>,
885}
886
887#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
888#[serde(deny_unknown_fields)]
889pub struct WasmComponentConfiguration {
891 #[serde(rename = "ref")]
894 pub reference: crate::v1::helpers::LocationReference,
895 #[serde(default)]
898 #[serde(skip_serializing_if = "Vec::is_empty")]
899 pub volumes: Vec<ExposedVolume>,
900 #[serde(default)]
903 #[serde(skip_serializing_if = "Option::is_none")]
904 pub max_packet_size: Option<u32>,
905 #[serde(default)]
908 #[serde(skip_serializing_if = "Vec::is_empty")]
909 pub with: Vec<Field>,
910 #[serde(default)]
913 #[serde(skip_serializing_if = "Vec::is_empty")]
914 pub operations: Vec<OperationDefinition>,
915}
916
917#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
918#[serde(deny_unknown_fields)]
919pub struct WasmComponentModel {
921 #[serde(rename = "ref")]
924 pub reference: crate::v1::helpers::LocationReference,
925 #[serde(default)]
928 #[serde(skip_serializing_if = "Vec::is_empty")]
929 pub volumes: Vec<ExposedVolume>,
930 #[serde(default)]
933 #[serde(skip_serializing_if = "Vec::is_empty")]
934 pub with: Vec<Field>,
935 #[serde(default)]
938 #[serde(skip_serializing_if = "Vec::is_empty")]
939 pub operations: Vec<OperationDefinition>,
940}
941
942#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
943#[serde(deny_unknown_fields)]
944pub struct ExposedVolume {
946 pub resource: BoundIdentifier,
948 pub path: String,
950}
951
952#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
953#[serde(deny_unknown_fields)]
954#[serde(tag = "kind")]
955pub enum ComponentKind {
957 #[serde(rename = "wick/component/wasmrs@v1")]
959 WasmComponentConfiguration(WasmComponentConfiguration),
960 #[serde(rename = "wick/component/wasm@v1")]
962 WasmComponentModel(WasmComponentModel),
963 #[serde(rename = "wick/component/composite@v1")]
965 CompositeComponentConfiguration(CompositeComponentConfiguration),
966 #[serde(rename = "wick/component/sql@v1")]
968 SqlComponent(SqlComponent),
969 #[serde(rename = "wick/component/http@v1")]
971 HttpClientComponent(HttpClientComponent),
972}
973
974#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
975#[serde(deny_unknown_fields)]
976#[serde(tag = "kind")]
977pub enum ImportDefinition {
979 #[serde(rename = "wick/component/types@v1")]
981 TypesComponent(TypesComponent),
982 #[serde(rename = "wick/component/manifest@v1")]
984 ManifestComponent(ManifestComponent),
985 #[serde(rename = "wick/component/sql@v1")]
987 SqlComponent(SqlComponent),
988 #[serde(rename = "wick/component/http@v1")]
990 HttpClientComponent(HttpClientComponent),
991}
992
993#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
994#[serde(deny_unknown_fields)]
995#[serde(tag = "kind")]
996pub enum ComponentDefinition {
998 #[serde(rename = "wick/component/grpc@v1")]
1000 GrpcUrlComponent(GrpcUrlComponent),
1001 #[serde(rename = "wick/component/manifest@v1")]
1003 ManifestComponent(ManifestComponent),
1004 #[serde(rename = "wick/component/reference@v1")]
1006 ComponentReference(ComponentReference),
1007 #[serde(rename = "wick/component/sql@v1")]
1009 SqlComponent(SqlComponent),
1010 #[serde(rename = "wick/component/http@v1")]
1012 HttpClientComponent(HttpClientComponent),
1013}
1014
1015#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1016#[serde(deny_unknown_fields)]
1017pub struct TypesComponent {
1019 #[serde(rename = "ref")]
1022 pub reference: crate::v1::helpers::LocationReference,
1023 #[serde(default)]
1026 #[serde(skip_serializing_if = "Vec::is_empty")]
1027 pub types: Vec<String>,
1028}
1029
1030#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1031#[serde(deny_unknown_fields)]
1032pub struct ComponentReference {
1034 pub id: BoundIdentifier,
1036}
1037
1038#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
1039#[serde(deny_unknown_fields)]
1040pub struct HostConfig {
1042 #[serde(default)]
1045 pub allow_latest: bool,
1046 #[serde(default)]
1049 #[serde(skip_serializing_if = "Vec::is_empty")]
1050 pub insecure_registries: Vec<String>,
1051 #[serde(default)]
1054 #[serde(skip_serializing_if = "Option::is_none")]
1055 pub rpc: Option<HttpConfig>,
1056}
1057
1058#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1059#[serde(deny_unknown_fields)]
1060pub struct HttpConfig {
1062 #[serde(default)]
1065 pub enabled: bool,
1066 #[serde(default)]
1069 #[serde(skip_serializing_if = "Option::is_none")]
1070 pub port: Option<u16>,
1071 #[serde(default)]
1074 #[serde(skip_serializing_if = "Option::is_none")]
1075 pub address: Option<String>,
1076 #[serde(default)]
1079 #[serde(skip_serializing_if = "Option::is_none")]
1080 pub pem: Option<crate::v1::helpers::LocationReference>,
1081 #[serde(default)]
1084 #[serde(skip_serializing_if = "Option::is_none")]
1085 pub key: Option<crate::v1::helpers::LocationReference>,
1086 #[serde(default)]
1089 #[serde(skip_serializing_if = "Option::is_none")]
1090 pub ca: Option<crate::v1::helpers::LocationReference>,
1091}
1092
1093#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1094#[serde(deny_unknown_fields)]
1095pub struct GrpcUrlComponent {
1097 pub url: String,
1099 #[serde(default)]
1102 #[serde(skip_serializing_if = "Option::is_none")]
1103 pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
1104}
1105
1106#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1107#[serde(deny_unknown_fields)]
1108pub struct ManifestComponent {
1110 #[serde(rename = "ref")]
1113 pub reference: crate::v1::helpers::LocationReference,
1114 #[serde(default)]
1117 #[serde(skip_serializing_if = "Option::is_none")]
1118 pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
1119 #[serde(default)]
1122 #[serde(skip_serializing_if = "HashMap::is_empty")]
1123 #[serde(deserialize_with = "crate::helpers::kv_deserializer")]
1124 pub provide: HashMap<String, String>,
1125 #[serde(default)]
1128 #[serde(skip_serializing_if = "Option::is_none")]
1129 pub max_packet_size: Option<u32>,
1130}
1131
1132#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1133#[serde(deny_unknown_fields)]
1134pub struct CompositeOperationDefinition {
1136 #[serde(default)]
1139 pub name: String,
1140 #[serde(default)]
1143 #[serde(skip_serializing_if = "Vec::is_empty")]
1144 pub with: Vec<Field>,
1145 #[serde(default)]
1148 #[serde(skip_serializing_if = "Vec::is_empty")]
1149 pub inputs: Vec<Field>,
1150 #[serde(default)]
1153 #[serde(skip_serializing_if = "Vec::is_empty")]
1154 pub outputs: Vec<Field>,
1155 #[serde(default)]
1158 #[serde(skip_serializing_if = "Vec::is_empty")]
1159 pub uses: Vec<OperationInstance>,
1160 #[serde(default)]
1163 #[serde(skip_serializing_if = "Vec::is_empty")]
1164 #[serde(deserialize_with = "crate::v1::parse::vec_connection")]
1165 pub flow: Vec<FlowExpression>,
1166 #[serde(default)]
1169 #[serde(skip_serializing_if = "Vec::is_empty")]
1170 pub operations: Vec<CompositeOperationDefinition>,
1171}
1172
1173#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1174#[serde(deny_unknown_fields)]
1175#[serde(untagged)]
1176pub enum FlowExpression {
1178 #[serde(rename = "ConnectionDefinition")]
1180 ConnectionDefinition(ConnectionDefinition),
1181 #[serde(rename = "BlockExpression")]
1183 BlockExpression(BlockExpression),
1184}
1185
1186#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1187#[serde(deny_unknown_fields)]
1188pub struct BlockExpression {
1190 #[serde(skip_serializing_if = "Vec::is_empty")]
1191 #[serde(deserialize_with = "crate::v1::parse::vec_connection")]
1192 pub expressions: Vec<FlowExpression>,
1193}
1194
1195#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1196#[serde(into = "String")]
1197#[serde(deny_unknown_fields)]
1198pub struct ConnectionDefinition {
1200 pub from: ConnectionTargetDefinition,
1202 pub to: ConnectionTargetDefinition,
1204}
1205
1206#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1207#[serde(deny_unknown_fields)]
1208pub struct ConnectionTargetDefinition {
1210 pub instance: String,
1212 #[serde(default)]
1215 #[serde(skip_serializing_if = "Option::is_none")]
1216 pub port: Option<String>,
1217 #[serde(default)]
1220 #[serde(skip_serializing_if = "Option::is_none")]
1221 pub data: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
1222}
1223
1224#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1225#[serde(deny_unknown_fields)]
1226pub struct OperationDefinition {
1228 #[serde(default)]
1231 pub name: String,
1232 #[serde(default)]
1235 #[serde(skip_serializing_if = "Vec::is_empty")]
1236 pub with: Vec<Field>,
1237 #[serde(default)]
1240 #[serde(skip_serializing_if = "Vec::is_empty")]
1241 pub inputs: Vec<Field>,
1242 #[serde(default)]
1245 #[serde(skip_serializing_if = "Vec::is_empty")]
1246 pub outputs: Vec<Field>,
1247}
1248
1249#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1250#[serde(deny_unknown_fields)]
1251pub struct Field {
1253 pub name: String,
1255 #[serde(rename = "type")]
1258 pub ty: TypeSignature,
1259 #[serde(default)]
1262 #[serde(skip_serializing_if = "Option::is_none")]
1263 pub description: Option<String>,
1264}
1265
1266#[derive(Debug, Clone, serde_with::DeserializeFromStr, Serialize, PartialEq)]
1267#[serde(deny_unknown_fields)]
1268#[serde(into = "String")]
1269#[serde(tag = "kind")]
1270pub enum TypeSignature {
1271 #[serde(rename = "I8")]
1273 I8(I8),
1274 #[serde(rename = "I16")]
1276 I16(I16),
1277 #[serde(rename = "I32")]
1279 I32(I32),
1280 #[serde(rename = "I64")]
1282 I64(I64),
1283 #[serde(rename = "U8")]
1285 U8(U8),
1286 #[serde(rename = "U16")]
1288 U16(U16),
1289 #[serde(rename = "U32")]
1291 U32(U32),
1292 #[serde(rename = "U64")]
1294 U64(U64),
1295 #[serde(rename = "F32")]
1297 F32(F32),
1298 #[serde(rename = "F64")]
1300 F64(F64),
1301 #[serde(rename = "Bool")]
1303 Bool(Bool),
1304 #[serde(rename = "StringType")]
1306 StringType(StringType),
1307 #[serde(rename = "Optional")]
1309 Optional(Optional),
1310 #[serde(rename = "Datetime")]
1312 Datetime(Datetime),
1313 #[serde(rename = "Bytes")]
1315 Bytes(Bytes),
1316 #[serde(rename = "Custom")]
1318 Custom(Custom),
1319 #[serde(rename = "List")]
1321 List(List),
1322 #[serde(rename = "Map")]
1324 Map(Map),
1325 #[serde(rename = "Object")]
1327 Object(Object),
1328}
1329
1330#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1331#[serde(deny_unknown_fields)]
1332pub struct I8;
1333
1334#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1335#[serde(deny_unknown_fields)]
1336pub struct I16;
1337
1338#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1339#[serde(deny_unknown_fields)]
1340pub struct I32;
1341
1342#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1343#[serde(deny_unknown_fields)]
1344pub struct I64;
1345
1346#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1347#[serde(deny_unknown_fields)]
1348pub struct U8;
1349
1350#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1351#[serde(deny_unknown_fields)]
1352pub struct U16;
1353
1354#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1355#[serde(deny_unknown_fields)]
1356pub struct U32;
1357
1358#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1359#[serde(deny_unknown_fields)]
1360pub struct U64;
1361
1362#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1363#[serde(deny_unknown_fields)]
1364pub struct F32;
1365
1366#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1367#[serde(deny_unknown_fields)]
1368pub struct F64;
1369
1370#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1371#[serde(deny_unknown_fields)]
1372pub struct Bool;
1373
1374#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1375#[serde(deny_unknown_fields)]
1376pub struct StringType;
1377
1378#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1379#[serde(deny_unknown_fields)]
1380pub struct Datetime;
1381
1382#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1383#[serde(deny_unknown_fields)]
1384pub struct Bytes;
1385
1386#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1387#[serde(deny_unknown_fields)]
1388pub struct Custom {
1389 #[serde(default)]
1392 pub name: String,
1393}
1394
1395#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1396#[serde(deny_unknown_fields)]
1397pub struct Optional {
1398 #[serde(rename = "type")]
1399 pub ty: Box<TypeSignature>,
1400}
1401
1402#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1403#[serde(deny_unknown_fields)]
1404pub struct List {
1405 #[serde(rename = "type")]
1406 pub ty: Box<TypeSignature>,
1407}
1408
1409#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1410#[serde(deny_unknown_fields)]
1411pub struct Map {
1412 pub key: Box<TypeSignature>,
1413
1414 pub value: Box<TypeSignature>,
1415}
1416
1417#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1418#[serde(deny_unknown_fields)]
1419pub struct Object;
1420
1421#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1422#[serde(deny_unknown_fields)]
1423#[serde(tag = "kind")]
1424pub enum TypeDefinition {
1426 #[serde(rename = "wick/type/struct@v1")]
1428 StructSignature(StructSignature),
1429 #[serde(rename = "wick/type/enum@v1")]
1431 EnumSignature(EnumSignature),
1432 #[serde(rename = "wick/type/union@v1")]
1434 UnionSignature(UnionSignature),
1435}
1436
1437#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1438#[serde(deny_unknown_fields)]
1439pub struct StructSignature {
1441 #[serde(default)]
1444 pub name: String,
1445 #[serde(default)]
1448 #[serde(skip_serializing_if = "Vec::is_empty")]
1449 pub fields: Vec<Field>,
1450 #[serde(default)]
1453 #[serde(skip_serializing_if = "Option::is_none")]
1454 pub description: Option<String>,
1455}
1456
1457#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1458#[serde(deny_unknown_fields)]
1459pub struct UnionSignature {
1461 #[serde(default)]
1464 pub name: String,
1465 #[serde(default)]
1468 #[serde(skip_serializing_if = "Vec::is_empty")]
1469 pub types: Vec<TypeSignature>,
1470 #[serde(default)]
1473 #[serde(skip_serializing_if = "Option::is_none")]
1474 pub description: Option<String>,
1475}
1476
1477#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1478#[serde(deny_unknown_fields)]
1479pub struct EnumSignature {
1481 #[serde(default)]
1484 pub name: String,
1485 #[serde(default)]
1488 #[serde(skip_serializing_if = "Vec::is_empty")]
1489 pub variants: Vec<EnumVariant>,
1490 #[serde(default)]
1493 #[serde(skip_serializing_if = "Option::is_none")]
1494 pub description: Option<String>,
1495}
1496
1497#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1498#[serde(deny_unknown_fields)]
1499pub struct EnumVariant {
1501 #[serde(default)]
1504 pub name: String,
1505 #[serde(default)]
1508 #[serde(skip_serializing_if = "Option::is_none")]
1509 pub index: Option<u32>,
1510 #[serde(default)]
1513 #[serde(skip_serializing_if = "Option::is_none")]
1514 pub value: Option<String>,
1515 #[serde(default)]
1518 #[serde(skip_serializing_if = "Option::is_none")]
1519 pub description: Option<String>,
1520}
1521
1522#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1523#[serde(deny_unknown_fields)]
1524pub struct OperationInstance {
1526 pub name: String,
1528 #[serde(serialize_with = "crate::v1::helpers::serialize_component_expression")]
1531 #[serde(deserialize_with = "crate::v1::parse::component_operation_syntax")]
1532 pub operation: ComponentOperationExpression,
1533 #[serde(default)]
1536 #[serde(skip_serializing_if = "Option::is_none")]
1537 pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
1538 #[serde(default)]
1541 #[serde(skip_serializing_if = "Option::is_none")]
1542 pub timeout: Option<u64>,
1543}
1544
1545#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1546#[serde(deny_unknown_fields)]
1547pub struct TestDefinition {
1549 #[serde(default)]
1552 #[serde(skip_serializing_if = "Option::is_none")]
1553 pub name: Option<String>,
1554 pub operation: String,
1556 #[serde(default)]
1559 #[serde(skip_serializing_if = "Option::is_none")]
1560 pub inherent: Option<InherentData>,
1561 #[serde(default)]
1564 #[serde(skip_serializing_if = "Option::is_none")]
1565 pub with: Option<HashMap<String, liquid_json::LiquidJsonValue>>,
1566 #[serde(default)]
1569 #[serde(alias = "input")]
1570 #[serde(skip_serializing_if = "Vec::is_empty")]
1571 pub inputs: Vec<PacketData>,
1572 #[serde(default)]
1575 #[serde(alias = "output")]
1576 #[serde(skip_serializing_if = "Vec::is_empty")]
1577 pub outputs: Vec<TestPacketData>,
1578}
1579
1580#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1581#[serde(deny_unknown_fields)]
1582pub struct InherentData {
1584 #[serde(default)]
1587 #[serde(skip_serializing_if = "Option::is_none")]
1588 pub seed: Option<u64>,
1589 #[serde(default)]
1592 #[serde(skip_serializing_if = "Option::is_none")]
1593 pub timestamp: Option<u64>,
1594}
1595
1596#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1597#[serde(deny_unknown_fields)]
1598#[serde(untagged)]
1599pub enum PacketData {
1601 #[serde(rename = "SuccessPacket")]
1603 SuccessPacket(SuccessPacket),
1604 #[serde(rename = "SignalPacket")]
1606 SignalPacket(SignalPacket),
1607 #[serde(rename = "ErrorPacket")]
1609 ErrorPacket(ErrorPacket),
1610}
1611
1612#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1613#[serde(deny_unknown_fields)]
1614#[serde(untagged)]
1615pub enum TestPacketData {
1617 #[serde(rename = "SuccessPacket")]
1619 SuccessPacket(SuccessPacket),
1620 #[serde(rename = "SignalPacket")]
1622 SignalPacket(SignalPacket),
1623 #[serde(rename = "PacketAssertionDef")]
1625 PacketAssertionDef(PacketAssertionDef),
1626 #[serde(rename = "ErrorPacket")]
1628 ErrorPacket(ErrorPacket),
1629}
1630
1631#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1632#[serde(deny_unknown_fields)]
1633pub struct SignalPacket {
1635 pub name: String,
1637 #[deprecated()]
1640 #[serde(default)]
1641 #[serde(skip_serializing_if = "Option::is_none")]
1642 pub flags: Option<PacketFlags>,
1643 #[serde(default)]
1646 #[serde(skip_serializing_if = "Option::is_none")]
1647 pub flag: Option<PacketFlag>,
1648}
1649
1650#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1651#[serde(deny_unknown_fields)]
1652pub struct SuccessPacket {
1654 pub name: String,
1656 #[serde(alias = "data")]
1659 pub value: liquid_json::LiquidJsonValue,
1660}
1661
1662#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1663#[serde(deny_unknown_fields)]
1664pub struct PacketAssertionDef {
1666 pub name: String,
1668 #[serde(default)]
1671 #[serde(skip_serializing_if = "Vec::is_empty")]
1672 pub assertions: Vec<PacketAssertion>,
1673}
1674
1675#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1676#[serde(deny_unknown_fields)]
1677pub struct PacketAssertion {
1679 #[serde(default)]
1682 #[serde(skip_serializing_if = "Option::is_none")]
1683 pub path: Option<String>,
1684 pub operator: AssertionOperator,
1686 pub value: liquid_json::LiquidJsonValue,
1688}
1689
1690#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
1691#[serde(deny_unknown_fields)]
1692pub enum AssertionOperator {
1694 Equals = 0,
1695 LessThan = 1,
1696 GreaterThan = 2,
1697 Regex = 3,
1698 Contains = 4,
1699}
1700
1701impl Default for AssertionOperator {
1702 fn default() -> Self {
1703 Self::from_u16(0).unwrap()
1704 }
1705}
1706
1707impl FromPrimitive for AssertionOperator {
1708 fn from_i64(n: i64) -> Option<Self> {
1709 Some(match n {
1710 0 => Self::Equals,
1711 1 => Self::LessThan,
1712 2 => Self::GreaterThan,
1713 3 => Self::Regex,
1714 4 => Self::Contains,
1715 _ => {
1716 return None;
1717 }
1718 })
1719 }
1720
1721 fn from_u64(n: u64) -> Option<Self> {
1722 Some(match n {
1723 0 => Self::Equals,
1724 1 => Self::LessThan,
1725 2 => Self::GreaterThan,
1726 3 => Self::Regex,
1727 4 => Self::Contains,
1728 _ => {
1729 return None;
1730 }
1731 })
1732 }
1733}
1734
1735#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1736#[serde(deny_unknown_fields)]
1737pub struct ErrorPacket {
1738 pub name: String,
1740 #[deprecated()]
1743 #[serde(default)]
1744 #[serde(skip_serializing_if = "Option::is_none")]
1745 pub flags: Option<PacketFlags>,
1746 #[serde(default)]
1749 #[serde(skip_serializing_if = "Option::is_none")]
1750 pub flag: Option<PacketFlag>,
1751 pub error: LiquidTemplate,
1753}
1754
1755#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1756#[serde(deny_unknown_fields)]
1757pub struct PacketFlags {
1759 #[serde(default)]
1762 pub done: bool,
1763 #[serde(default)]
1766 pub open: bool,
1767 #[serde(default)]
1770 pub close: bool,
1771}
1772
1773#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
1774#[serde(deny_unknown_fields)]
1775pub enum PacketFlag {
1777 Done = 0,
1779 Open = 1,
1781 Close = 2,
1783}
1784
1785impl Default for PacketFlag {
1786 fn default() -> Self {
1787 Self::from_u16(0).unwrap()
1788 }
1789}
1790
1791impl FromPrimitive for PacketFlag {
1792 fn from_i64(n: i64) -> Option<Self> {
1793 Some(match n {
1794 0 => Self::Done,
1795 1 => Self::Open,
1796 2 => Self::Close,
1797 _ => {
1798 return None;
1799 }
1800 })
1801 }
1802
1803 fn from_u64(n: u64) -> Option<Self> {
1804 Some(match n {
1805 0 => Self::Done,
1806 1 => Self::Open,
1807 2 => Self::Close,
1808 _ => {
1809 return None;
1810 }
1811 })
1812 }
1813}
1814
1815#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1816#[serde(deny_unknown_fields)]
1817pub struct SqlComponent {
1819 pub resource: BoundIdentifier,
1821 #[serde(default)]
1824 pub tls: bool,
1825 #[serde(default)]
1828 #[serde(skip_serializing_if = "Vec::is_empty")]
1829 pub with: Vec<Field>,
1830 #[serde(default)]
1833 #[serde(skip_serializing_if = "Vec::is_empty")]
1834 pub operations: Vec<SqlQueryKind>,
1835}
1836
1837#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1838#[serde(deny_unknown_fields)]
1839#[serde(untagged)]
1840pub enum SqlQueryKind {
1841 #[serde(rename = "SqlQueryOperationDefinition")]
1843 SqlQueryOperationDefinition(SqlQueryOperationDefinition),
1844 #[serde(rename = "SqlExecOperationDefinition")]
1846 SqlExecOperationDefinition(SqlExecOperationDefinition),
1847}
1848
1849#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1850#[serde(deny_unknown_fields)]
1851pub struct SqlQueryOperationDefinition {
1853 pub name: String,
1855 #[serde(default)]
1858 #[serde(skip_serializing_if = "Vec::is_empty")]
1859 pub with: Vec<Field>,
1860 #[serde(default)]
1863 #[serde(skip_serializing_if = "Vec::is_empty")]
1864 pub inputs: Vec<Field>,
1865 #[serde(default)]
1868 #[serde(skip_serializing_if = "Vec::is_empty")]
1869 pub outputs: Vec<Field>,
1870 pub query: String,
1872 #[serde(default)]
1875 #[serde(skip_serializing_if = "Vec::is_empty")]
1876 pub arguments: Vec<String>,
1877 #[serde(default)]
1880 #[serde(skip_serializing_if = "Option::is_none")]
1881 pub on_error: Option<ErrorBehavior>,
1882}
1883
1884#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1885#[serde(deny_unknown_fields)]
1886pub struct SqlExecOperationDefinition {
1888 pub name: String,
1890 #[serde(default)]
1893 #[serde(skip_serializing_if = "Vec::is_empty")]
1894 pub with: Vec<Field>,
1895 #[serde(default)]
1898 #[serde(skip_serializing_if = "Vec::is_empty")]
1899 pub inputs: Vec<Field>,
1900 #[serde(default)]
1903 #[serde(skip_serializing_if = "Vec::is_empty")]
1904 pub outputs: Vec<Field>,
1905 pub exec: String,
1907 #[serde(default)]
1910 #[serde(skip_serializing_if = "Vec::is_empty")]
1911 pub arguments: Vec<String>,
1912 #[serde(default)]
1915 #[serde(skip_serializing_if = "Option::is_none")]
1916 pub on_error: Option<ErrorBehavior>,
1917}
1918
1919#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
1920#[serde(deny_unknown_fields)]
1921pub enum ErrorBehavior {
1923 Ignore = 0,
1925 Commit = 1,
1927 Rollback = 2,
1929}
1930
1931impl Default for ErrorBehavior {
1932 fn default() -> Self {
1933 Self::from_u16(0).unwrap()
1934 }
1935}
1936
1937impl FromPrimitive for ErrorBehavior {
1938 fn from_i64(n: i64) -> Option<Self> {
1939 Some(match n {
1940 0 => Self::Ignore,
1941 1 => Self::Commit,
1942 2 => Self::Rollback,
1943 _ => {
1944 return None;
1945 }
1946 })
1947 }
1948
1949 fn from_u64(n: u64) -> Option<Self> {
1950 Some(match n {
1951 0 => Self::Ignore,
1952 1 => Self::Commit,
1953 2 => Self::Rollback,
1954 _ => {
1955 return None;
1956 }
1957 })
1958 }
1959}
1960
1961#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1962#[serde(deny_unknown_fields)]
1963pub struct HttpClientComponent {
1965 pub resource: BoundIdentifier,
1967 #[serde(default)]
1970 #[serde(skip_serializing_if = "Option::is_none")]
1971 pub codec: Option<Codec>,
1972 #[serde(default)]
1975 #[serde(skip_serializing_if = "Option::is_none")]
1976 pub proxy: Option<Proxy>,
1977 #[serde(default)]
1980 #[serde(skip_serializing_if = "Option::is_none")]
1981 pub timeout: Option<u16>,
1982 #[serde(default)]
1985 #[serde(skip_serializing_if = "Vec::is_empty")]
1986 pub with: Vec<Field>,
1987 #[serde(default)]
1990 #[serde(skip_serializing_if = "Vec::is_empty")]
1991 pub operations: Vec<HttpClientOperationDefinition>,
1992}
1993
1994#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
1995#[serde(deny_unknown_fields)]
1996pub struct Proxy {
1997 #[serde(default)]
2000 pub resource: String,
2001 #[serde(default)]
2004 #[serde(skip_serializing_if = "Option::is_none")]
2005 pub username: Option<String>,
2006 #[serde(default)]
2009 #[serde(skip_serializing_if = "Option::is_none")]
2010 pub password: Option<String>,
2011}
2012
2013#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
2014#[serde(deny_unknown_fields)]
2015pub struct HttpClientOperationDefinition {
2017 pub name: String,
2019 #[serde(default)]
2022 #[serde(skip_serializing_if = "Vec::is_empty")]
2023 pub with: Vec<Field>,
2024 #[serde(default)]
2027 #[serde(skip_serializing_if = "Vec::is_empty")]
2028 pub inputs: Vec<Field>,
2029 pub method: HttpMethod,
2031 #[serde(default)]
2034 #[serde(skip_serializing_if = "Option::is_none")]
2035 pub codec: Option<Codec>,
2036 #[serde(default)]
2039 #[serde(skip_serializing_if = "Option::is_none")]
2040 pub headers: Option<HashMap<String, Vec<String>>>,
2041 #[serde(default)]
2044 #[serde(skip_serializing_if = "Option::is_none")]
2045 pub body: Option<liquid_json::LiquidJsonValue>,
2046 #[serde(default)]
2049 pub path: String,
2050}
2051
2052#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
2053#[serde(deny_unknown_fields)]
2054pub enum Codec {
2056 Json = 0,
2058 Raw = 1,
2060 FormData = 2,
2062 Text = 3,
2064}
2065
2066impl Default for Codec {
2067 fn default() -> Self {
2068 Self::from_u16(0).unwrap()
2069 }
2070}
2071
2072impl FromPrimitive for Codec {
2073 fn from_i64(n: i64) -> Option<Self> {
2074 Some(match n {
2075 0 => Self::Json,
2076 1 => Self::Raw,
2077 2 => Self::FormData,
2078 3 => Self::Text,
2079 _ => {
2080 return None;
2081 }
2082 })
2083 }
2084
2085 fn from_u64(n: u64) -> Option<Self> {
2086 Some(match n {
2087 0 => Self::Json,
2088 1 => Self::Raw,
2089 2 => Self::FormData,
2090 3 => Self::Text,
2091 _ => {
2092 return None;
2093 }
2094 })
2095 }
2096}
2097
2098#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
2099#[serde(deny_unknown_fields)]
2100pub enum HttpMethod {
2102 Get = 0,
2104 Post = 1,
2106 Put = 2,
2108 Delete = 3,
2110}
2111
2112impl Default for HttpMethod {
2113 fn default() -> Self {
2114 Self::from_u16(0).unwrap()
2115 }
2116}
2117
2118impl FromPrimitive for HttpMethod {
2119 fn from_i64(n: i64) -> Option<Self> {
2120 Some(match n {
2121 0 => Self::Get,
2122 1 => Self::Post,
2123 2 => Self::Put,
2124 3 => Self::Delete,
2125 _ => {
2126 return None;
2127 }
2128 })
2129 }
2130
2131 fn from_u64(n: u64) -> Option<Self> {
2132 Some(match n {
2133 0 => Self::Get,
2134 1 => Self::Post,
2135 2 => Self::Put,
2136 3 => Self::Delete,
2137 _ => {
2138 return None;
2139 }
2140 })
2141 }
2142}