wick_config/config/common/
component_implementation.rs

1use wick_interface_types::OperationSignatures;
2
3use crate::config::{self};
4
5#[derive(Debug, Clone, derive_asset_container::AssetManager, serde::Serialize)]
6#[asset(asset(config::AssetReference))]
7#[must_use]
8/// A root-level wick component implementation.
9#[serde(rename_all = "kebab-case")]
10pub enum ComponentImplementation {
11  /// A wasmRS component.
12  Wasm(config::WasmComponentDefinition),
13  /// A wasmRS component.
14  WasmRs(config::WasmRsComponent),
15  /// A composite component.
16  Composite(config::CompositeComponentImplementation),
17  /// A sql component.
18  Sql(config::components::SqlComponentConfig),
19  /// An http client component.
20  HttpClient(config::components::HttpClientComponentConfig),
21}
22
23impl ComponentImplementation {
24  /// Get the kind of component represented by this configuration.
25  pub const fn kind(&self) -> ComponentKind {
26    match self {
27      ComponentImplementation::Wasm(_) => ComponentKind::Wasm,
28      ComponentImplementation::WasmRs(_) => ComponentKind::WasmRs,
29      ComponentImplementation::Composite(_) => ComponentKind::Composite,
30      ComponentImplementation::Sql(_) => ComponentKind::Sql,
31      ComponentImplementation::HttpClient(_) => ComponentKind::HttpClient,
32    }
33  }
34
35  #[must_use]
36  /// Get the operation signatures for this component.
37  pub fn operation_signatures(&self) -> Vec<wick_interface_types::OperationSignature> {
38    match self {
39      ComponentImplementation::Wasm(c) => c.operation_signatures(),
40      ComponentImplementation::WasmRs(c) => c.operation_signatures(),
41      ComponentImplementation::Composite(c) => c.operation_signatures(),
42      ComponentImplementation::Sql(c) => c.operation_signatures(),
43      ComponentImplementation::HttpClient(c) => c.operation_signatures(),
44    }
45  }
46
47  #[must_use]
48  /// Get the default name for this component.
49  pub fn default_name(&self) -> &'static str {
50    match self {
51      ComponentImplementation::Wasm(_) => panic!("Wasm components must be named"),
52      ComponentImplementation::WasmRs(_) => panic!("WasmRs components must be named"),
53      ComponentImplementation::Composite(_) => panic!("Composite components must be named"),
54      ComponentImplementation::Sql(_) => "wick/component/sql",
55      ComponentImplementation::HttpClient(_) => "wick/component/http",
56    }
57  }
58}
59
60impl Default for ComponentImplementation {
61  fn default() -> Self {
62    ComponentImplementation::Composite(config::CompositeComponentImplementation::default())
63  }
64}
65
66#[derive(Debug, Clone, Copy, PartialEq, serde::Serialize)]
67#[must_use]
68/// The kind of component represented by ComponentImplementation.
69#[serde(rename_all = "kebab-case")]
70pub enum ComponentKind {
71  /// A wasm component.
72  Wasm,
73  /// A wasmRs component.
74  WasmRs,
75  /// A composite component.
76  Composite,
77  /// A sql component.
78  Sql,
79  /// An http client component.
80  HttpClient,
81}
82
83impl std::fmt::Display for ComponentKind {
84  fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
85    match self {
86      ComponentKind::Wasm => write!(f, "wick/component/wasm"),
87      ComponentKind::WasmRs => write!(f, "wick/component/wasmrs"),
88      ComponentKind::Composite => write!(f, "wick/component/composite"),
89      ComponentKind::Sql => write!(f, "wick/component/sql"),
90      ComponentKind::HttpClient => write!(f, "wick/component/http"),
91    }
92  }
93}