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()
}