metron-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Casey Stella <>
Subject Stellar support for switch/case style conditionals
Date Tue, 17 Oct 2017 16:05:38 GMT
Hi All,

It's high time that Stellar supports some form of conditional that is
beyond if/then/else.  Right now, the way to do fall-through conditionals is:

if x < 10 then 'info' else if x >= 10 && x <= 20 then 'warn' else 'critical'

That becomes non-scalable very quickly.  I wanted to facilitate a
discussion with the community on the syntax.  I'll give a few options and
you guys/gals can come up with your own suggestions too, but I wanted to
frame teh conversation.


With the advent of METRON-1254 (,
we could enable (from a language perspective in Stellar) multi-part
conditionals or switch/case style statements.  To wit:

MAP_GET(true, { x < 10 : 'info', x >= 10 && x <= 20 : 'warn', x > 20 :
'critical' })

Or, with a convenience function:

CASE( { x < 10 : 'info', x >= 10 && x <= 20 : 'warn', x > 20 : 'critical'

The issue with this is that the last true condition wins because we're
using a map.


We could correct this by adding a list of pairs construction to stellar:

CASE( [ x < 10 : 'info', x <= 20 : 'warn'], 'critical')

This would enable us to allow the first true condition to win, so the
second condition can be simpler and we could pass a default return value as
the final argument.
The downside to this, is that it requires a language enhancement (the list
of pairs construction you see there).


Some of the problems with the previous statements are that every
conditional has to be evaluated and there is no opportunity to short
circuit.  They're all evaluated at parse-time rather than execution time.
We could, instead, construct a lambda function approach to this and support
short-circuiting in even complex conditionals:

CASE( real_variable_name, [ x -> x < 10 ? 'info', x -> x <= 20 ? 'warn' ],
CASE( real_variable_name, [ x -> if x < 10 then 'info', x -> if x <= 20
then 'warn' ], 'critical')

This would require lessening ?: (if/then/else) syntax to support to enable
just if without else conditions.  This also has the benefit of allowing
simplifying the expression due to lambda function variable renaming
(real_variable_name can be much more complex (or even an expression) than

Creative other approaches to this are appreciated!



  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message