ExPression

Hex VersionDocsLicenseCoverage Status

Eval user input expressions in your Elixir project.

Installation

The package can be installed by adding ex_pression to your list of dependencies in mix.exs:

def deps do
  [
    {:ex_pression, "~> 0.4.0"}
  ]
end

SAFE

Safe evaluation without acces to other Elixir modules.

ExPression.eval("exit(self())")
{:error, %ExPression.Error{name: "UndefinedFunctionError", message: "Function 'self/0' was referenced, but was not defined", data: %{function: :self}}}

JSON

Support for JSON syntax and data types.

iex> ExPression.eval("""
{
  "name": "ex_pression",
  "deps": ["xpeg"]
}
""")
{:ok, %{"name" => "ex_pression", "deps" => ["xpeg"]}}

PYTHON

Familiar python-like operators and standard functions.

iex> ExPression.eval(~s/{"1": "en", "2": "fr"}[str(int_code)]/, bindings: %{"int_code" => 1})
{:ok, "en"}

EXTEND

Extend expressions by providing Elixir module with functions that you want to use.

defmodule MyFunctions do
  # use $ special symbol in expressions
  def handle_special("$", date_str), do: Date.from_iso8601!(date_str)
  # Use diff function in expresions
  def diff(date_1, date_2), do: Date.diff(date_1, date_2)
end

iex> ExPression.eval(~s/diff($"2023-02-02", $"2022-02-02")/, functions_module: MyFunctions)
{:ok, 365}

Features list

Implementation

String representation of expression is parsed into AST form. Parsing is done with PEG grammar parser xpeg. Grammar is defined in module ExPression.Parsing.Grammar. AST interpretation logic is written in plain Elixir in module ExPression.Interpreting.

Contribution

Feel free to make a pull request. All contributions are appreciated!