use std::borrow::Cow;
use wick_interface_types::{Field, OperationSignatures};
use crate::config::components::{ComponentConfig, OperationConfig};
use crate::config::{self, ExposedVolume, OperationDefinition};
use crate::utils::VecMapInto;
#[derive(
Debug, Clone, derive_asset_container::AssetManager, derive_builder::Builder, property::Property, serde::Serialize,
)]
#[property(get(public), set(public), mut(public, suffix = "_mut"))]
#[builder(setter(into))]
#[asset(asset(config::AssetReference))]
#[must_use]
pub struct WasmComponentImplementation {
pub(crate) reference: config::AssetReference,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) config: Vec<Field>,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) volumes: Vec<ExposedVolume>,
#[asset(skip)]
#[builder(default)]
#[property(skip)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) operations: Vec<OperationDefinition>,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) max_packet_size: Option<u32>,
}
impl OperationSignatures for WasmComponentImplementation {
fn operation_signatures(&self) -> Vec<wick_interface_types::OperationSignature> {
self.operations.clone().map_into()
}
}
impl ComponentConfig for WasmComponentImplementation {
type Operation = OperationDefinition;
fn operations(&self) -> &[Self::Operation] {
&self.operations
}
fn operations_mut(&mut self) -> &mut Vec<Self::Operation> {
&mut self.operations
}
}
impl OperationConfig for OperationDefinition {
fn name(&self) -> &str {
&self.name
}
fn inputs(&self) -> Cow<Vec<Field>> {
Cow::Borrowed(&self.inputs)
}
fn outputs(&self) -> Cow<Vec<Field>> {
Cow::Borrowed(&self.outputs)
}
}