How to return or break from an action early?

In an action I need to check numerous times if certain params have been passed. Some params are optional, others depend on others. That is, if one param is nil, its counterpart must be present.

How can I return or break early from an action once I encounter that a mandatory parameter hasn’t been passed?

I know, that I could restructure my code in such as a way, that a whole “if … then … else” tree will return “render” in the end. But it’d be a very complex, deeply nested “if … then … else” tree. I want to break early instead.

1 Like

I’d use helper functions, that bring the data into a uniform shape, or use with. But to be more exact one needs to know more about your concrete data that comes in and how it gets processed.

You can use pattern match on action function head, or case on params, with fallback.

Or use cond.

I’d use pattern match on func head early as possible (e.g. action function, not on helper function) to make the precondition/requirement of data super clear.

Dear Rijidaru,

I am not especially familiar with the concept of “action”, but from an Erlang point of view i would agree with @chulkilee : if you declare functions with all the combinations that you expect to encounter and that are valid,
you would only need to keep the specific instructions for each case inside that function and leave the rest for a common function called further.

I have read somewhere (I think) that there is an added value in using functions with mathing signatures because they could bring benefits that the case statement could not, but I can’t remember I’d have to look it up. Basically I think that something like :

my_function(MostProbableArgs,nil,valid_arguments,{ok,Args} ->
    Res = process(MostProbableArgs),
    Return = [ X bor Y || X <- Res, Y <- Args ];

my_function(LessProbableArgs,error_msg,invalid_args,{ok,Args}) ->
    erlang:error("Invalid Arguments");

my_function(VeryRareArgs,nil,valid_but_rare_arguments,{ok,Args}) ->
    logger:log(notice, "you are doing strage operations !"),
    Return = weird.

If this is enough for you to solve your issue I think it might be a pretty easy way to do it, but I do not know about the specifics related to Elixir unfortunately so I can’t really help about that :confused:

Best,

Laymer

my question already assumes that case and cond are used

it’s already described in my question

No. There is only a draft about data points which have to exist mutually exclusive.

I can not find any code example that shows actual code or how incomming data is actually structured.

1 Like

Have you tried pattern matching on function level?

def my_fun(param1, nil) do
  raise "param2 cannot be nil"
end

def my_fun(param1, param2) when is_map(param1) do
  raise "param1 cannot be a map"
end

(...)

Not yet. If raise errors, why also use pattern matching?

If you’re conditions are more of flat, then case with multiple match inside func or pattern match on func would be enough.

If your case is more complicated - such as 5 sequential validation and return in the middle of it - then use with or running multiple func as pipeline. Something like Plug. See this talk

1 Like