Skip to main content

wavs_types/
service_builder.rs

1use serde::{Deserialize, Serialize};
2use std::collections::BTreeMap;
3
4#[cfg(feature = "ts-bindings")]
5use ts_rs::TS;
6
7use crate::{Component, ServiceManager, ServiceStatus, SignatureKind, Submit, Trigger, WorkflowId};
8
9/// This struct is only used in the CLI to build up a service for later uploading.
10#[cfg_attr(feature = "ts-bindings", derive(TS))]
11#[cfg_attr(feature = "ts-bindings", ts(export))]
12#[derive(Serialize, Deserialize, Clone, Debug)]
13#[serde(rename_all = "snake_case")]
14pub struct ServiceBuilder {
15    pub name: String,
16    pub workflows: BTreeMap<WorkflowId, WorkflowBuilder>,
17    pub status: ServiceStatus,
18    pub manager: ServiceManagerBuilder,
19}
20
21#[cfg_attr(feature = "ts-bindings", derive(TS))]
22#[cfg_attr(feature = "ts-bindings", ts(export))]
23#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
24#[serde(rename_all = "snake_case")]
25pub struct WorkflowBuilder {
26    pub trigger: TriggerBuilder,
27    pub component: ComponentBuilder,
28    pub submit: SubmitBuilder,
29}
30
31#[cfg_attr(feature = "ts-bindings", derive(TS))]
32#[cfg_attr(feature = "ts-bindings", ts(export))]
33#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
34#[serde(rename_all = "snake_case", untagged)]
35pub enum TriggerBuilder {
36    Trigger(Trigger),
37    Builder(Builder),
38}
39
40impl Default for TriggerBuilder {
41    fn default() -> Self {
42        TriggerBuilder::Builder(Builder::Unset)
43    }
44}
45
46#[cfg_attr(feature = "ts-bindings", derive(TS))]
47#[cfg_attr(feature = "ts-bindings", ts(export))]
48#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
49#[serde(rename_all = "snake_case", untagged)]
50#[allow(clippy::large_enum_variant)]
51pub enum SubmitBuilder {
52    Submit(Submit),
53    Builder(Builder),
54    AggregatorBuilder(AggregatorBuilder),
55}
56
57#[cfg_attr(feature = "ts-bindings", derive(TS))]
58#[cfg_attr(feature = "ts-bindings", ts(export))]
59#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
60#[serde(rename_all = "snake_case")]
61pub enum AggregatorBuilder {
62    Aggregator {
63        component: ComponentBuilder,
64        signature_kind: SignatureKind,
65    },
66}
67
68impl Default for SubmitBuilder {
69    fn default() -> Self {
70        SubmitBuilder::Builder(Builder::Unset)
71    }
72}
73
74#[cfg_attr(feature = "ts-bindings", derive(TS))]
75#[cfg_attr(feature = "ts-bindings", ts(export))]
76#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
77#[serde(rename_all = "snake_case", untagged)]
78pub enum ServiceManagerBuilder {
79    Manager(ServiceManager),
80    Builder(Builder),
81}
82
83impl Default for ServiceManagerBuilder {
84    fn default() -> Self {
85        ServiceManagerBuilder::Builder(Builder::Unset)
86    }
87}
88
89#[cfg_attr(feature = "ts-bindings", derive(TS))]
90#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
91#[serde(rename_all = "snake_case")]
92pub enum Builder {
93    Unset,
94}
95
96#[cfg_attr(feature = "ts-bindings", derive(TS))]
97#[cfg_attr(feature = "ts-bindings", ts(export))]
98#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
99#[serde(rename_all = "snake_case", untagged)]
100#[allow(clippy::large_enum_variant)]
101pub enum ComponentBuilder {
102    Component(Component),
103    Builder(Builder),
104}
105
106impl ComponentBuilder {
107    pub fn new(component: Component) -> Self {
108        ComponentBuilder::Component(component)
109    }
110
111    pub fn new_unset() -> Self {
112        ComponentBuilder::Builder(Builder::Unset)
113    }
114
115    pub fn is_unset(&self) -> bool {
116        matches!(self, ComponentBuilder::Builder(Builder::Unset))
117    }
118
119    pub fn is_set(&self) -> bool {
120        matches!(self, ComponentBuilder::Component(_))
121    }
122
123    pub fn as_component(&self) -> Option<&Component> {
124        match self {
125            ComponentBuilder::Component(component) => Some(component),
126            ComponentBuilder::Builder(Builder::Unset) => None,
127        }
128    }
129
130    pub fn as_component_mut(&mut self) -> Option<&mut Component> {
131        match self {
132            ComponentBuilder::Component(component) => Some(component),
133            ComponentBuilder::Builder(Builder::Unset) => None,
134        }
135    }
136}
137
138impl Default for ComponentBuilder {
139    fn default() -> Self {
140        ComponentBuilder::Builder(Builder::Unset)
141    }
142}