juiz_core 0.0.9

Core library for JUIZ application. This package is not required if you want to build juiz functional module.
use std::sync::{Arc, Mutex};

use super::core_broker::CoreBrokerPtr;
use crate::prelude::*;

use super::broker_ptr::BrokerPtr;

pub struct BrokerFactoryImpl {
    core: ObjectCore,
    core_broker: CoreBrokerPtr,
    create_function: fn(core_broker: CoreBrokerPtr, Value) -> JuizResult<BrokerPtr>,
}

impl BrokerFactoryImpl {
    pub fn new(
        core_broker: CoreBrokerPtr,
        manifest: Value,
        create_function: fn(core_broker: CoreBrokerPtr, Value) -> JuizResult<BrokerPtr>,
    ) -> JuizResult<Arc<Mutex<BrokerFactoryImpl>>> {
        let class_name = "BrokerFactoryImpl";
        let type_name = obj_get_str(&manifest, "type_name")?;

        Ok(Arc::new(Mutex::new(BrokerFactoryImpl {
            core_broker: core_broker.clone(),
            core: ObjectCore::create_factory(JuizObjectClass::BrokerFactory(class_name), type_name),
            create_function: create_function,
        })))
    }
}

impl JuizObjectCoreHolder for BrokerFactoryImpl {
    fn core(&self) -> &ObjectCore {
        &self.core
    }
}

impl JuizObject for BrokerFactoryImpl {}

impl BrokerFactory for BrokerFactoryImpl {
    fn create_broker(&self, manifest: Value) -> JuizResult<BrokerPtr> {
        (self.create_function)(self.core_broker.clone(), manifest)
    }
}

pub fn create_broker_factory_impl(
    core_broker: CoreBrokerPtr,
    manifest: Value,
    create_broker_function: fn(core_broker: CoreBrokerPtr, Value) -> JuizResult<BrokerPtr>,
) -> JuizResult<Arc<Mutex<dyn BrokerFactory>>> {
    Ok(BrokerFactoryImpl::new(
        core_broker,
        manifest,
        create_broker_function,
    )?)
}

impl Drop for BrokerFactoryImpl {
    fn drop(&mut self) {
        log::trace!("BrokerFactoryImpl({})::drop() called", self.type_name());
    }
}