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