lib/gcode/model/expr/list.ex

defmodule Gcode.Model.Expr.List do
  defstruct elements: []
  alias Gcode.Model.{Expr, Expr.List}
  use Gcode.Result
  import Gcode.Model.Expr.Helpers

  @moduledoc """
  Represents an array expression in G-code.
  """

  @type t :: %List{elements: [Expr.t()]}

  @doc """
  Initialise a `List` from a boolean value.
  """
  @spec init :: Result.t(t)
  def init, do: ok(%List{})

  @doc """
  Push an expressions onto the list.
  """
  @spec push(t, Expr.t()) :: Result.t(t)
  def push(%List{elements: elements}, expr) when is_expression(expr),
    do: ok(%List{elements: [expr | elements]})

  def push(%List{}, expr),
    do: error({:expression_error, "Expected expression, but received #{inspect(expr)}"})
end