defmodule Vize.CSS.URL do
@moduledoc "A parser-backed CSS `url()` reference."
defstruct [:url, :range, :location]
@type t :: %__MODULE__{
url: String.t(),
range: Vize.Range.t(),
location: Vize.SourceRange.t()
}
@type input :: %{
required(:url) => String.t(),
required(:start) => non_neg_integer(),
required(:end) => non_neg_integer(),
optional(:start_line) => pos_integer() | nil,
optional(:start_column) => pos_integer() | nil,
optional(:end_line) => pos_integer() | nil,
optional(:end_column) => pos_integer() | nil
}
@spec new(input() | t()) :: t()
def new(%__MODULE__{} = url), do: url
def new(%{} = attrs) do
%__MODULE__{
url: Map.fetch!(attrs, :url),
range: %Vize.Range{
start: Map.fetch!(attrs, :start),
end: Map.fetch!(attrs, :end)
},
location: %Vize.SourceRange{
start: %Vize.SourceLocation{
line: Map.get(attrs, :start_line),
column: Map.get(attrs, :start_column)
},
end: %Vize.SourceLocation{
line: Map.get(attrs, :end_line),
column: Map.get(attrs, :end_column)
}
}
}
end
end