defmodule Kameleoon.Data.Geolocation do
@moduledoc false
alias Kameleoon.Data.Validation
@enforce_keys [:country]
defstruct [:country, region: nil, city: nil, postal_code: nil, latitude: nil, longitude: nil]
@type t :: %__MODULE__{
country: String.t(),
region: String.t() | nil,
city: String.t() | nil,
postal_code: String.t() | nil,
latitude: number() | nil,
longitude: number() | nil
}
@spec new!(String.t(), keyword()) :: t()
def new!(country, opts \\ []) do
opts =
Validation.keyword!(opts,
region: nil,
city: nil,
postal_code: nil,
latitude: nil,
longitude: nil
)
%__MODULE__{
country: Validation.non_empty_string!(country, :country),
region: Validation.string_or_nil!(opts[:region], :region),
city: Validation.string_or_nil!(opts[:city], :city),
postal_code: Validation.string_or_nil!(opts[:postal_code], :postal_code),
latitude: Validation.number_or_nil!(opts[:latitude], :latitude),
longitude: Validation.number_or_nil!(opts[:longitude], :longitude)
}
end
end