Json rules

Rules written in json will be deprecated in version 0.8.0 and support will be removed in version 0.9.0 in favor of rules written in the Reval DSL.

A rule is written as a json structure with a name and an associated expression. The name is what identifies the rule and should be unique in the rule-set. The expression is what will be evaluated. The expression is a nested tree-structure. At the root is the first expression that will be evaluated. Expressions can have parameters and depending on the expression these parameters can themselves be expressions.

{
    "name": "Example rule",
    "expr": {"string": ""}
}

Expressions

Expressions are written as a key-value pair in json, the key is the name of the expression and the value is either one parameter if the expression only takes one parameter. In most cases expressions take more than one parameter so the value will be a list.

Expression names are in lower-case.

Value Expressions

The simpelest expressions are value expressions. Reval values can have different types and there is one value expression for each type. The primitive types that Reval uses are String, Int, Decimal, Float and Bool and there are expressions for each of these;

{ "string": "This is a string value" }
{ "int": -5 }
{ "decimal": 5.132 }
{ "float": 5.15e28 }
{ "bool": true }

None value

none is a special value used to indicate that a value is not available. It can be used when passing values into a rule to indicate a missing value for example.

{"none"}

The expressions is_some and is_none can be used to test for none values. These are documented with the Special Expressions.

Comparison Expressions

Reval supports a number of comparison expressions that can be used to compare values. Al these expressions result in a boolean value.

Eq and neq

Eq is short for "equals" and compares equality. It returns true when the two parameters are exactly the same

{ "eq": [{"int": 5}, {"ref": "input"}] }

Neq is short for "not equal" and is the inverse of the eq expression. Compares equality of two parameters and returns false if they are the same.

{ "neq": [{"int": 5}, {"ref": "input"}] }

Special expressions

There are a couple of special expressions that allow express

Ref

The ref expression allow rules to access fields from input data by name

{"ref": "input_field_name"}

Idx

The idx expression indexes fields from map or vec values.

Fields from a vec can be indexed by number.

{"idx": [{ "ref": "some_vec_value" }, { "int": 5 } ]}

Fields from maps are indexed by string.

{"idx": [{ "ref": "some_map_value" }, { "string": "sub-field" } ]}

None checks

The is_some and is_none expressions test for none values.

is_some checks for none values and returns true if the expression returns a value that is not equal to none.

{"is_some": {"string": "some value"}}

This returns true because {"string": "some value"} is not none

is_none checks for none values and returns true if the expression returns a value that is equal to none.

{"is_none": "none"}

This returns true

Gt, gte, lt and lte

Gt is short for "greater than" it compares two numeric values of the same type, lt is "less than" and is the inverse. Gte and lte are the inclusive versions of these operations. They are short for "Greater than or equal" and "Less than or equal"

{ "gt": [{"int": 5}, {"ref": "input"}] }
{ "gte": [{"int": 5}, {"ref": "input"}] }
{ "lt": [{"int": 5}, {"ref": "input"}] }
{ "lte": [{"int": 5}, {"ref": "input"}] }

Logic expressions

Logic expressions perform logic operations on boolean values. These can be used to combine results from comparison expressions for example. Logic expressions take one or more boolean expressions as parameters and return a boolean value when evaluated.

Not

The not expression inverts a boolean value. So true becomes false and false becomes true.

{ "not": { "bool": false } }

And

The logical and expression takes two sub-expressions as parameters and only evaluates to true if both parameters evaluate to true.

{
    "and": [ 
        { "gte": [{ "ref": "input_1" }, { "int": 5 }]},
        { "gte": [{ "ref": "input_2" }, { "float": 15.9 }]}
    ]
}

Or

The logical or expression takes two sub-expressions as parameters and only evaluates to false if both parameters evaluate to false.

{
    "or": [ 
        { "gte": [{ "ref": "input_1" }, { "int": 5 }]},
        { "gte": [{ "ref": "input_2" }, { "float": 15.9 }]}
    ]
}

Calculation

  • Add
  • Sub
  • Mul
  • Div

Conversions

Reval has three expressions that allow conversions between numeric types, each of these takes one expression as a parameter.

  • CFloat
  • CInt
  • CDecimal