Packages

An idiomatic Elixir interface to Beancount that serves as the long-term behavioral oracle for a future native Elixir General Ledger.

Current section

Files

Jump to
beancount_ex lib beancount engine elixir validator.ex
Raw

lib/beancount/engine/elixir/validator.ex

defmodule Beancount.Engine.Elixir.Validator do
@moduledoc false
alias Beancount.Engine.Elixir.Ledger
alias Beancount.Result
@spec validate([Beancount.Directive.t()], keyword()) :: {:ok, Result.t()} | {:error, Result.t()}
def validate(directives, opts \\ []) do
opts
|> Ledger.new()
|> Ledger.process(directives)
|> build_result()
end
defp build_result(%Ledger{} = ledger) do
errors = Ledger.errors(ledger)
if errors == [] do
{:ok,
%Result{
status: :ok,
exit_status: 0,
stdout: "",
stderr: "",
normalized: %{status: :ok, errors: []}
}}
else
normalized = %{
status: :error,
errors: errors |> Enum.sort_by(&{&1.message, &1.line || 0})
}
{:error,
%Result{
status: :error,
exit_status: 1,
stdout: "",
stderr: "",
normalized: normalized
}}
end
end
end