45 lines
1.2 KiB
Elixir
45 lines
1.2 KiB
Elixir
defmodule Mobilizon.Service.Geospatial.Hat do
|
|
@moduledoc """
|
|
Hat backend.
|
|
"""
|
|
|
|
alias Mobilizon.Addresses.Address
|
|
alias Mobilizon.Service.Geospatial.Addok
|
|
alias Mobilizon.Service.Geospatial.Nominatim
|
|
alias Mobilizon.Service.Geospatial.Provider
|
|
import Mobilizon.Service.Geospatial.Provider, only: [endpoint: 1]
|
|
require Logger
|
|
|
|
@behaviour Provider
|
|
|
|
@impl Provider
|
|
@doc """
|
|
Hat implementation for `c:Mobilizon.Service.Geospatial.Provider.geocode/3`.
|
|
"""
|
|
@spec geocode(String.t(), keyword()) :: list(Address.t())
|
|
def geocode(lon, lat, options \\ []) do
|
|
tasks = [
|
|
Task.async(fn -> Addok.geocode(lon, lat, options) end),
|
|
Task.async(fn -> Nominatim.geocode(lon, lat, options) end)
|
|
]
|
|
|
|
[addrlist1, addrlist2] = Task.await_many(tasks, 12_000)
|
|
addrlist2 ++ addrlist1
|
|
end
|
|
|
|
@impl Provider
|
|
@doc """
|
|
Hat implementation for `c:Mobilizon.Service.Geospatial.Provider.search/2`.
|
|
"""
|
|
@spec search(String.t(), keyword()) :: list(Address.t())
|
|
def search(q, options \\ []) do
|
|
tasks = [
|
|
Task.async(fn -> Addok.search(q, options) end),
|
|
Task.async(fn -> Nominatim.search(q, options) end)
|
|
]
|
|
|
|
[addrlist1, addrlist2] = Task.await_many(tasks, 12_000)
|
|
addrlist2 ++ addrlist1
|
|
end
|
|
end
|