melodium-engine 0.10.0

Mélodium core engine and executor implementation
Documentation
pub mod compiled;
pub mod designed;
pub mod source;

pub use compiled::Builder as CompiledBuilder;
pub use designed::Builder as DesignedBuilder;
pub use source::Builder as SourceBuilder;

use super::Builder;
use crate::world::World;
use crate::{descriptor::Treatment, error::LogicResult};
use melodium_common::descriptor::{Buildable, Status, TreatmentBuildMode};
use std::sync::Arc;

pub fn get_builder(
    world: Arc<World>,
    descriptor: &Arc<dyn Buildable<TreatmentBuildMode>>,
) -> LogicResult<Arc<dyn Builder>> {
    match descriptor.build_mode() {
        TreatmentBuildMode::Compiled(build_fn, desc) => Status::new_success(Arc::new(
            CompiledBuilder::new(Arc::downgrade(&world), desc, build_fn),
        )),
        TreatmentBuildMode::Source(desc) => {
            Status::new_success(Arc::new(SourceBuilder::new(Arc::downgrade(&world), desc)))
        }
        TreatmentBuildMode::Designed() => Arc::clone(descriptor)
            .downcast_arc::<Treatment>()
            .unwrap()
            .design()
            .and_then(|design| {
                Status::new_success(
                    Arc::new(DesignedBuilder::new(Arc::downgrade(&world), design))
                        as Arc<dyn Builder>,
                )
            }),
    }
}