ExLedger.Predicate.Parser (ex_ledger v0.6.1)

Parser for ledger automated transaction predicates.

Parses predicate strings like:

  • /Expenses:Food/ - account regex
  • payee =~ /Grocery/ - payee regex match
  • note =~ /reimbursable/ - note regex match
  • has_tag(/business/) - tag existence check
  • tag("Project") =~ /Alpha/ - tag value match
  • amount > $100 - amount comparison
  • expr and expr - logical AND
  • expr or expr - logical OR
  • ( expr ) - grouping

Returns an AST that can be evaluated by ExLedger.Predicate.Evaluator.

Summary

Functions

Parses a predicate string into an AST.

Parses a predicate string, raising on failure.

Parses the given binary as predicate_parser.

Types

ast()

@type ast() ::
  {:account_regex, Regex.t()}
  | {:payee_regex, Regex.t()}
  | {:note_regex, Regex.t()}
  | {:has_tag, Regex.t()}
  | {:tag_value, String.t(), Regex.t()}
  | {:amount_gt, Decimal.t(), String.t() | nil}
  | {:amount_lt, Decimal.t(), String.t() | nil}
  | {:amount_eq, Decimal.t(), String.t() | nil}
  | {:and, ast(), ast()}
  | {:or, ast(), ast()}
  | {:not, ast()}

Functions

parse(input)

@spec parse(String.t()) :: {:ok, ast()} | {:error, term()}

Parses a predicate string into an AST.

Returns {:ok, ast} on success, {:error, reason} on failure.

Examples

iex> Parser.parse("/Expenses:Food/")
{:ok, {:account_regex, ~r/Expenses:Food/}}

iex> Parser.parse("payee =~ /Grocery/")
{:ok, {:payee_regex, ~r/Grocery/}}

iex> Parser.parse("/Expenses:/ and payee =~ /Grocery/")
{:ok, {:and, {:account_regex, ~r/Expenses:/}, {:payee_regex, ~r/Grocery/}}}

parse!(input)

@spec parse!(String.t()) :: ast()

Parses a predicate string, raising on failure.

predicate_parser(binary, opts \\ [])

@spec predicate_parser(binary(), keyword()) ::
  {:ok, [term()], rest, context, line, byte_offset}
  | {:error, reason, rest, context, line, byte_offset}
when line: {pos_integer(), byte_offset},
     byte_offset: non_neg_integer(),
     rest: binary(),
     reason: String.t(),
     context: map()

Parses the given binary as predicate_parser.

Returns {:ok, [token], rest, context, position, byte_offset} or {:error, reason, rest, context, line, byte_offset} where position describes the location of the predicate_parser (start position) as {line, offset_to_start_of_line}.

To column where the error occurred can be inferred from byte_offset - offset_to_start_of_line.

Options

  • :byte_offset - the byte offset for the whole binary, defaults to 0
  • :line - the line and the byte offset into that line, defaults to {1, byte_offset}
  • :context - the initial context value. It will be converted to a map