defmodule BubbleMatch do readme = Path.join(__DIR__, "../README.md") @external_resource readme @moduledoc File.read!(readme) defstruct ast: nil, q: "" @type t :: __MODULE__ @type input :: [input] | String.t() | BubbleMatch.Sentence.t() @type match_result :: :nomatch | {:match, captures :: map()} @type parse_opts :: [parse_opt()] @type parse_opt :: {:expand, boolean()} | {:concepts_compiler, fun()} @doc """ Match a given input against a BML query. """ @spec match(expr :: t | String.t(), input :: input()) :: match_result() defdelegate match(expr, input), to: BubbleMatch.Matcher @doc """ Parse a string into a BML expression. """ @spec parse(expr :: String.t(), parse_opts()) :: {:ok, t()} | {:error, String.t()} defdelegate parse(expr, opts \\ []), to: BubbleMatch.Parser @doc """ Parse a string into a BML expression, raises on error. """ @spec parse!(expr :: String.t(), parse_opts()) :: t() defdelegate parse!(expr, opts \\ []), to: BubbleMatch.Parser end defimpl Inspect, for: BubbleMatch do import Inspect.Algebra def inspect(struct, _opts) do concat(["#BML<", struct.q, ">"]) end end defimpl String.Chars, for: BubbleMatch do def to_string(struct) do struct.q end end defimpl Jason.Encoder, for: BubbleMatch do def encode(struct, opts) do Jason.Encode.string(struct.q, opts) end end