#![allow(missing_docs)] use std::collections::HashMap;
use std::path::{Path, PathBuf};
use asset_container::{AssetManager, Assets};
use wick_asset_reference::AssetReference;
use wick_interface_types::{OperationSignatures, TypeDefinition};
use wick_packet::RuntimeConfig;
use super::common::package_definition::PackageConfig;
use super::components::ComponentConfig;
use super::template_config::Renderable;
use super::OperationDefinition;
use crate::config;
use crate::error::ManifestError;
#[derive(
Debug, Clone, derive_builder::Builder, derive_asset_container::AssetManager, property::Property, serde::Serialize,
)]
#[property(get(public), set(public), mut(public, suffix = "_mut"))]
#[asset(asset(AssetReference))]
#[must_use]
pub struct TypesConfiguration {
#[asset(skip)]
#[builder(setter(strip_option), default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) name: Option<String>,
#[asset(skip)]
#[property(skip)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) source: Option<PathBuf>,
#[asset(skip)]
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) metadata: Option<config::Metadata>,
#[asset(skip)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) types: Vec<TypeDefinition>,
#[asset(skip)]
#[property(skip)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) operations: Vec<OperationDefinition>,
#[builder(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) package: Option<PackageConfig>,
}
impl TypesConfiguration {
#[must_use]
pub fn get_type(&self, name: &str) -> Option<&TypeDefinition> {
self.types.iter().find(|t| t.name() == name)
}
#[must_use]
pub fn version(&self) -> Option<&str> {
self.metadata.as_ref().map(|m| m.version.as_str())
}
#[must_use]
pub fn package_files(&self) -> Option<Assets<AssetReference>> {
self.package.as_ref().map(|p| p.assets())
}
pub fn set_source(&mut self, source: &Path) {
let source = source.to_path_buf();
self.source = Some(source);
}
pub(super) fn update_baseurls(&self) {
#[allow(clippy::expect_used)]
let mut source = self.source.clone().expect("No source set for this configuration");
if !source.is_dir() {
source.pop();
}
self.set_baseurl(&source);
}
#[must_use]
pub const fn env(&self) -> Option<&HashMap<String, String>> {
None
}
#[allow(clippy::missing_const_for_fn)]
pub fn validate(&self) -> Result<(), ManifestError> {
Ok(())
}
}
impl OperationSignatures for TypesConfiguration {
fn operation_signatures(&self) -> Vec<wick_interface_types::OperationSignature> {
self.operations.clone().into_iter().map(Into::into).collect()
}
}
impl ComponentConfig for TypesConfiguration {
type Operation = OperationDefinition;
fn operations(&self) -> &[Self::Operation] {
&self.operations
}
fn operations_mut(&mut self) -> &mut Vec<Self::Operation> {
&mut self.operations
}
}
impl Renderable for TypesConfiguration {
fn render_config(
&mut self,
_source: Option<&Path>,
_root_config: Option<&RuntimeConfig>,
_env: Option<&HashMap<String, String>>,
) -> Result<(), ManifestError> {
Ok(())
}
}