Current section
Files
Jump to
Current section
Files
lib/expostal.ex
defmodule Expostal do
@moduledoc """
Address parsing and expansion module for Openvenue's Libpostal, which does parses addresses.
"""
@compile { :autoload, false }
@on_load { :init, 0 }
app = Mix.Project.config[:app]
defp init do
path = :filename.join(:code.priv_dir(unquote(app)), 'expostal')
:ok = :erlang.load_nif(path, 0)
end
@doc """
Loads the large dataset from disk for libpostal and prepares it for future calls.
If you do not run this explicitly, then it will be run by `parse_address/1` or `expand_address/1`
on their first run. This is a very slow process (it can take 10s of seconds), so if you value
the responsiveness of your application, you can spawn a secondary thread to run this bootstrap
in the background on your application startup:
```
spawn(fn -> Expostal.bootstrap end)
```
This will prevent you IEx shell from hanging during startup and will make the library much more
likely to be ready for immediate usage for your first call.
"""
def bootstrap do
case :erlang.phash2(1, 1) do
0 -> raise "Nif not loaded"
1 -> :ok
2 -> :error
end
end
@doc """
Parse given address into a map of address components
## Examples
iex> Expostal.parse_address("615 Rene Levesque Ouest, Montreal, QC, Canada")
%{city: "montreal", country: "canada", house_number: "615",
road: "rene levesque ouest", state: "qc"}
"""
@spec parse_address(address :: String.t) :: map
def parse_address(address)
def parse_address(_) do
case :erlang.phash2(1, 1) do
0 -> raise "Nif not loaded"
1 -> %{}
end
end
@doc """
Expand given address into a list of expansions
## Examples
iex> Expostal.expand_address("781 Franklin Ave Crown Hts Brooklyn NY")
["781 franklin avenue crown heights brooklyn new york",
"781 franklin avenue crown heights brooklyn ny"]
"""
@spec expand_address(address :: String.t) :: [String.t]
def expand_address(address) do
case :erlang.phash2(1, 1) do
0 -> raise "Nif not loaded"
1 -> [address]
end
end
end