Packages
surgex
2.23.0
6.0.1
6.0.0
5.1.1
5.1.0
5.0.0
5.0.0-git-015aa39a
4.15.2
4.15.1
4.15.1-git-98b3
4.15.0
4.15.0-git-943e
4.15.0-git-5806
4.14.1
4.14.0
4.13.1
4.13.0
4.12.0
4.11.0
4.11.0-git-97d4
4.11.0-git-14c8
4.10.0
4.10.0-git-37f2
4.9.0
4.9.0-git-9d5f
4.8.1-git-80a7
4.8.0
4.8.0-git-fbda
4.8.0-git-e058
4.7.0
4.7.0-git-5414
4.6.1
4.6.0
4.5.0
4.4.0
4.3.0
4.2.1
4.2.0
4.1.1
4.1.1-git-9f6b
4.1.1-git-6f0cd
4.1.0
4.1.0-git-e934
4.1.0-git-8c28
4.1.0-git-56a9
4.1.0-git-55fd
4.0.0
3.2.8
3.2.7
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
retired
3.1.0
3.0.0
2.24.1
2.24.0
retired
2.23.0
2.22.0
2.21.0
2.20.1
2.20.0
2.19.0
2.18.1
2.18.0
2.17.0
2.16.0
2.15.0
2.14.0
2.13.0
2.12.1
2.12.0
2.11.0
2.10.0
2.9.0
2.8.0
2.7.0
2.6.0
2.5.1
2.5.0
2.4.0
retired
2.3.0
2.2.1
2.2.0
2.1.1
2.1.0
2.0.0
1.6.0
1.5.2
1.5.1
1.5.0
1.4.0
1.3.1
retired
1.3.0
retired
1.2.1
1.2.0
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
All Things Elixir @ Surge Ventures Inc, the creators of Fresha
Current section
Files
Jump to
Current section
Files
lib/surgex/parser/parsers/geolocation_parser.ex
defmodule Surgex.Parser.GeolocationParser do
@moduledoc false
alias Surgex.Parser.{FloatParser, Geolocation}
def call(nil), do: {:ok, nil}
def call(input) when is_binary(input) do
case String.split(input, ",") do
[lat_string, lng_string] ->
parse_lat_lng_strings(lat_string, lng_string)
_split_result ->
{:error, :invalid_geolocation_tuple}
end
end
def call({lat_string, lng_string}) when is_binary(lat_string) and is_binary(lng_string) do
parse_lat_lng_strings(lat_string, lng_string)
end
defp parse_lat_lng_strings(lat_string, lng_string) do
with {:ok, lat} <- FloatParser.call(lat_string),
{:ok, lng} <- FloatParser.call(lng_string),
true <- valid_location?(lat, lng) do
{:ok, %Geolocation{latitude: lat, longitude: lng}}
else
false -> {:error, :invalid_geolocation}
{:error, reason} -> {:error, reason}
end
end
defp valid_location?(lat, _lng) when lat < -90, do: false
defp valid_location?(lat, _lng) when lat > 90, do: false
defp valid_location?(_lat, lng) when lng < -180, do: false
defp valid_location?(_lat, lng) when lng > 180, do: false
defp valid_location?(_lat, _lng), do: true
end