Skip to main content

lib/vize/vapor/result.ex

defmodule Vize.Vapor.Result do
  @moduledoc "Result of Vapor template compilation."

  defstruct [:code, templates: [], diagnostics: []]

  @type t :: %__MODULE__{
          code: String.t(),
          templates: [String.t()],
          diagnostics: [Vize.Diagnostic.t()]
        }

  @type input :: %{
          required(:code) => String.t(),
          optional(:templates) => [String.t()],
          optional(:diagnostics) => [Vize.Diagnostic.input() | Vize.Diagnostic.t() | String.t()]
        }

  @spec new(input() | t()) :: t()
  def new(%__MODULE__{} = result), do: result

  def new(%{} = attrs) do
    %__MODULE__{
      code: Map.fetch!(attrs, :code),
      templates: Map.get(attrs, :templates, []),
      diagnostics: Enum.map(Map.get(attrs, :diagnostics, []), &Vize.Diagnostic.new/1)
    }
  end
end