defmodule Vize.SourceLocation do @moduledoc "A source position reported by Vize." defstruct [:offset, :line, :column] @type t :: %__MODULE__{ offset: non_neg_integer() | nil, line: pos_integer() | nil, column: pos_integer() | nil } @type input :: %{ optional(:offset) => non_neg_integer() | nil, optional(:line) => pos_integer() | nil, optional(:column) => pos_integer() | nil } @spec new(input() | t() | nil) :: t() | nil def new(nil), do: nil def new(%__MODULE__{} = location), do: location def new(%{} = attrs) do %__MODULE__{ offset: Map.get(attrs, :offset), line: Map.get(attrs, :line), column: Map.get(attrs, :column) } end end