Skip to main content

lib/kagi/maps_result.ex

defmodule Kagi.MapsResult do
  @moduledoc """
  A single Kagi Maps point-of-interest result.

  Returned in `Kagi.Maps.results`. Most fields are optional because Kagi Maps
  providers return different metadata.

  ## Fields

    * `:name` - place name.
    * `:address` - street address.
    * `:coordinates` - `Kagi.MapsResult.Coordinates` with latitude/longitude.
    * `:phone` - phone number in international format.
    * `:url` - website URL.
    * `:source` - upstream provider name.
    * `:id` - Kagi or upstream provider identifier.
    * `:rating` - average rating.
    * `:review_count` - number of reviews backing `:rating`.
    * `:price` - price tier string such as `"$"` or `"$$"`.
    * `:distance` - distance from `:ll`, when supplied.
    * `:hours_now` - open/closed indicator string.
    * `:types` - category tags.
    * `:links` - provider-specific links payload.
    * `:images` - image references payload.
  """

  alias Kagi.MapsResult.Coordinates

  @typedoc "A single Maps point of interest."
  @type t :: %__MODULE__{
          name: String.t(),
          address: String.t() | nil,
          coordinates: Coordinates.t(),
          phone: String.t() | nil,
          url: String.t() | nil,
          source: String.t() | nil,
          id: String.t() | nil,
          rating: float() | nil,
          review_count: non_neg_integer() | nil,
          price: String.t() | nil,
          distance: float() | nil,
          hours_now: String.t() | nil,
          types: [String.t()] | nil,
          links: term() | nil,
          images: term() | nil
        }

  defstruct [
    :name,
    :address,
    :coordinates,
    :phone,
    :url,
    :source,
    :id,
    :rating,
    :review_count,
    :price,
    :distance,
    :hours_now,
    :types,
    :links,
    :images
  ]
end