defmodule Vize.SourceRange do
@moduledoc "A source span reported by Vize."
defstruct [:start, :end, :source]
@type t :: %__MODULE__{
start: Vize.SourceLocation.t() | nil,
end: Vize.SourceLocation.t() | nil,
source: String.t() | nil
}
@type input :: %{
optional(:start) => Vize.SourceLocation.input() | Vize.SourceLocation.t() | nil,
optional(:end) => Vize.SourceLocation.input() | Vize.SourceLocation.t() | nil,
optional(:source) => String.t() | nil
}
@spec new(input() | t() | nil) :: t() | nil
def new(nil), do: nil
def new(%__MODULE__{} = range), do: range
def new(%{} = attrs) do
%__MODULE__{
start: Vize.SourceLocation.new(Map.get(attrs, :start)),
end: Vize.SourceLocation.new(Map.get(attrs, :end)),
source: Map.get(attrs, :source)
}
end
end