diff --git a/lib/service/geospatial/hat.ex b/lib/service/geospatial/hat.ex new file mode 100644 index 000000000..d743ee34b --- /dev/null +++ b/lib/service/geospatial/hat.ex @@ -0,0 +1,44 @@ +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