constraint <- ws? app_name ws? between_op ws? version ws? "," ws? version ws? !. / ws? app_name ws? constraint_op ws? version ws? !. / ws? app_name ws? !. ` case Node of [_,AppName,_, _] -> {ok, AppName}; [_,AppName,_,Op,_,Vsn,_, _] -> {ok, {AppName, rlx_goal_utils:to_vsn(Vsn), rlx_goal_utils:to_op(Op)}}; [_,AppName,_,Op,_,Vsn1,_,_,_,Vsn2,_,_] -> {ok, {AppName, rlx_goal_utils:to_vsn(Vsn1), rlx_goal_utils:to_vsn(Vsn2), rlx_goal_utils:to_op(Op)}}; _ -> io:format("~p~n", [Node]) end ` ; ws <- [ \t\n\s\r] ; app_name <- [a-zA-Z0-9_]+ ` erlang:list_to_atom(erlang:binary_to_list(erlang:iolist_to_binary(Node))) ` ; between_op <- ":" ws? ( "btwn" / "between" ) ws? ":" ` case Node of [C,_,Op,_,C] -> erlang:iolist_to_binary([C,Op,C]); _ -> Node end ` ; constraint_op <- "=" / "-" / "<=" / "<" / "~>" / ">=" / ">" / word_constraint_op / ":" ; word_constraint_op <- ":" ws? ( "gte" / "lte" / "gt" / "lt" / "pes" ) ws? ":" ` case Node of [C,_,Op,_,C] -> erlang:iolist_to_binary([C,Op,C]); _ -> Node end ` ; version <- [0-9a-zA-Z-+.]+ ; %% This only exists to get around a bug in erlang where if %% warnings_as_errors is specified `nowarn` directives are ignored `-compile(export_all).`