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 { serde_json, string, util };
use libflo_error::{ Result as FuncResult, WrapErr };
use serialization::{ dynamic_event, func };
use static_libflo::STATIC_LIBFLO;

#[no_mangle]
pub extern fn add_node(arg: &str) -> FuncResult<()> {
    let libflo = STATIC_LIBFLO.get().wrap_err_to_err()?;
    let mut this = util::get_this_mut(&libflo).wrap_err_to_err()?;
    let this = util::cast_this_mut(&mut this).wrap_err_to_err()?;

    let arg = serde_json::from_str::<func::AddNodeArg>(arg).wrap_err_to_err()?;

    let node_descs = this.get_node_descriptions().wrap_err_to_err()?;
    let node_index = this.get_graph_mut().wrap_err_to_err()?.add_node(arg.node_desc, node_descs.as_ref()).wrap_err_to_err()?;
    let graph = this.get_graph().wrap_err_to_err()?;
    let node = graph.get_node(node_index).wrap_err_to_err()?;

    let result = dynamic_event::AddNodeArg::new(
        node_index,
        node.get_node_desc(),
        node.get_input_connectors(),
        node.get_output_connectors()
    );

    libflo.send_event_by_module_name(
        string::self_module_name(),
        string::add_node(),
        &result
    ).wrap_err_to_err()
}