melodium_share/
model_design.rs

1use crate::{SharingResult, Value};
2use melodium_common::descriptor::{Collection, Identified};
3use melodium_engine::{
4    descriptor::Model as DesignedModel,
5    design::{Model, Parameter as DesignedParameter},
6};
7use serde::{Deserialize, Serialize};
8use std::{
9    collections::{BTreeMap, HashMap},
10    sync::Arc,
11};
12
13#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
14#[cfg_attr(feature = "webassembly", derive(tsify::Tsify))]
15#[cfg_attr(feature = "webassembly", tsify(into_wasm_abi, from_wasm_abi))]
16pub struct ModelDesign {
17    pub parameters: BTreeMap<String, Value>,
18}
19
20impl ModelDesign {
21    pub(crate) fn make_design(
22        &self,
23        collection: &Collection,
24        descriptor: &Arc<DesignedModel>,
25    ) -> SharingResult<Model> {
26        let mut result = SharingResult::new_success(());
27        let mut parameters = HashMap::with_capacity(self.parameters.len());
28
29        for (name, value) in &self.parameters {
30            if let Some(value) =
31                result.merge_degrade_failure(value.to_value(collection, descriptor.identifier()))
32            {
33                parameters.insert(
34                    name.clone(),
35                    DesignedParameter {
36                        name: name.clone(),
37                        value,
38                    },
39                );
40            }
41        }
42
43        result.and_then(|_| {
44            SharingResult::new_success(Model {
45                descriptor: Arc::downgrade(descriptor),
46                parameters,
47            })
48        })
49    }
50}
51
52impl From<&Model> for ModelDesign {
53    fn from(value: &Model) -> Self {
54        Self {
55            parameters: value
56                .parameters
57                .iter()
58                .map(|(name, param)| (name.clone(), (&param.value).into()))
59                .collect(),
60        }
61    }
62}