1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use { load, string };
use libflo::Libflo;
use libflo_error::{ Result as FuncResult, WrapErr, WrapError };
use error::*;
use std::any::Any;
use std::sync::Arc;
use static_libflo::STATIC_LIBFLO;
use util::Environment as GraphfloEnvironment;

#[no_mangle]
pub extern fn construct(libflo: &Any) -> FuncResult<()> {
    let libflo: Option<&Arc<Libflo>> = libflo.downcast_ref();

    if let Some(libflo) = libflo {
        let libflo = libflo.clone();
        STATIC_LIBFLO.set(libflo).wrap_err_to_err()?;
    } else {
        let err: Error = ErrorKind::ConstructEventNotPassedLibflo.into();
        return err.wrap_error_to_err();
    }

    let libflo = STATIC_LIBFLO.get().wrap_err_to_err()?;
    let payload = load(libflo.get_module_mapper(), libflo.get_path_resolver()).wrap_err_to_err()?;
    let this_module_id = libflo.get_module_mapper().get(string::self_module_name()).wrap_err_to_err()?;

    let graphflo_environment = Box::new(GraphfloEnvironment::new(payload.destructure()));

    libflo.set_module_data(this_module_id, graphflo_environment).wrap_err_to_err()?;

    Ok(())
}