Skip to main content

lib/kameleoon/data/geolocation.ex

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