Expression (expression v2.37.0)

Documentation for Expression, a library to parse and evaluate Floip compatible expressions

Expression is an expression language which consists of the functions provided by Excel with a few additions.

Function and variable names are not case-sensitive so UPPER is equivalent to upper:

contact.name -> Marshawn Lynch
FIRST_WORD(contact.name) -> Marshawn
first_word(CONTACT.NAME) -> Marshawn

For templating, RapidPro uses the @ character to denote either a single variable substitution or the beginning of an Expression block. @ was chosen as it is known how to type by a broad number of users regardless of keyboard. It does have the disadvantage of being used in email addresses and Twitter handles, but these are rarely ambiguous and escaping can be done easily via doubling of the character (@@).

Functions are called by using the block syntax:

10 plus 4 is @(SUM(10, 4))

Within a block, @ is not required to refer to variable in the context:

Hello @(contact.name)

A template can contain more than one substitution or block:

Hello @contact.name, you were born in @(YEAR(contact.birthday))

Summary

Types

Link to this type

expression_type()

@type expression_type() :: String.t() | number() | map() | DateTime.t() | Date.t()

Functions

@spec error(message :: term()) :: %{required(String.t()) => term()}

Generate an error map

Link to this function

escape(expression)

@spec escape(String.t()) :: String.t()
Link to this function

evaluate(expression, context \\ %{}, mod \\ Expression.Callbacks)

Link to this function

evaluate!(expression, context \\ %{}, mod \\ Expression.Callbacks)

Link to this function

evaluate_as_boolean!(expression, context \\ %{}, mod \\ Expression.Callbacks)

Link to this function

evaluate_as_string!(expression, context \\ %{}, mod \\ Expression.Callbacks)

Link to this function

evaluate_block(expression, context \\ %{}, mod \\ Expression.Callbacks, opts \\ [])

Link to this function

evaluate_block!(expression, context \\ %{}, mod \\ Expression.Callbacks, opts \\ [])

Link to this function

parse!(expression)

@spec parse!(String.t() | Number.t()) :: Keyword.t()
Link to this function

parse_expression(expression_block)

@spec parse_expression(String.t()) :: {:ok, Keyword.t()} | {:error, String.t()}
Link to this function

parse_expression!(expression_block)

@spec parse_expression!(String.t()) :: Keyword.t()
Link to this function

prewalk(ast, fun)

See Macro.prewalk/2.

Link to this function

stringify(items)

@spec stringify([expression_type()] | expression_type()) :: String.t()

Convert an Expression type into a string.

This function is applied to all values when Expression.evaluate_as_string!/3 is called.

Link to this function

traverse(ast, acc, pre, post)

See Macro.traverse/4.