melodium_share/
model_design.rs1use 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(), (¶m.value).into()))
59 .collect(),
60 }
61 }
62}