Current section
Files
Jump to
Current section
Files
lib/nop/element/condition.ex
defmodule NOP.Element.Condition do
use GenServer
use NOP.Element.LogicElement
def start_link(condition_name, premise_list, expression) do
state = init_state(condition_name, premise_list, expression)
state = init_condition_list(state)
{:ok, pid} = GenServer.start_link(__MODULE__, state, name: String.to_atom(condition_name))
link_to_elements(premise_list, pid, condition_name)
{:ok, pid}
end
def init(state) do
{:ok, state}
end
defp init_state(condition_name, premise_list, expression) do
premise_values = evaluate_elements(condition_name, premise_list)
result = evaluate_condition(condition_name, premise_values, expression)
%{:name => condition_name,
:premises => premise_list,
:expression => expression,
:values => premise_values,
:result => result}
end
defp evaluate_condition(_, _, "") do
true
end
defp evaluate_condition(condition_name, premise_values, expression) do
Logger.debug("Evaluating condition #{condition_name} with expression: << #{expression} >>")
expression_converted = convert_expression(premise_values, expression)
{result, []} = Code.eval_string(expression_converted)
Logger.debug("Condition #{condition_name} expression converted: << #{expression_converted} >> ? #{result}" )
result
end
defp get_expression_from_state(state) do
Map.get(state, :expression)
end
defp update_my_state(state, name, _element_name, values, _old_result) do
expression = get_expression_from_state(state)
evaluate_condition(name, values, expression)
end
defp convert_expression_int([], expression) do
expression
end
defp convert_expression_int([{atom, assert} | premise_list], expression) do
atom_string = to_string(atom)
assert_string = to_string(assert)
expression = String.replace(expression, atom_string, assert_string)
convert_expression_int(premise_list, expression)
end
defp convert_expression(premise_values, expression) do
#Convert To List
premise_list = Map.to_list(premise_values)
convert_expression_int(premise_list, expression)
end
end