use error_chain::bail;
use log::info;
use flowcore::model::input::InputInitializer::Always;
use flowcore::model::io::IO;
use flowcore::model::route::HasRoute;
use crate::compiler::compile::CompilerTables;
use crate::errors::*;
pub fn check_function_inputs(tables: &mut CompilerTables) -> Result<()> {
info!("\n=== Compiler: Checking all Function Inputs are connected");
for function in &tables.functions {
for input in function.get_inputs() {
if input.get_initializer().is_none() && input.get_flow_initializer().is_none()
&& tables.connection_to(input.route()).is_none() {
bail!("Input at route '{}' is not connected to nor initialized", input.route());
}
if got_constant_initializer(input) && tables.connection_to(input.route()).is_some() {
bail!("Input at route '{}' has a 'Constant' initializer and a connection to it",
input.route());
}
}
}
info!("No problems found. All functions have connections to all their inputs");
Ok(())
}
fn got_constant_initializer(input: &IO) -> bool {
matches!(input.get_initializer(), Some(Always(_)))
}
pub fn check_side_effects(tables: &mut CompilerTables) -> Result<()> {
info!("\n=== Compiler: Checking flow has side-effects");
for function in &tables.functions {
if function.is_impure() && !function.inputs.is_empty() {
info!("Flow has side effects from 1 or more functions");
return Ok(());
}
}
bail!("Flow has no side-effects")
}