Packages
BeamLabCountries is a collection of all sorts of useful information for every country in the [ISO 3166](https://wikipedia.org/wiki/ISO_3166) standard. It includes country data, subdivisions (states/provinces), international organizations, language information, and country name translations.
Current section
Files
Jump to
Current section
Files
lib/subdivision_loader.ex
defmodule BeamLabCountries.SubdivisionLoader do
@moduledoc false
alias BeamLabCountries.Subdivision
@subdivisions_dir Path.join([:code.priv_dir(:beamlab_countries), "data", "subdivisions"])
for file <- Path.wildcard(Path.join(@subdivisions_dir, "*.yaml")) do
@external_resource file
end
@doc """
Loads all subdivision data from YAML files at compile time.
Returns a map of country alpha2 code => %{upcased subdivision id => Subdivision}.
"""
def load do
@subdivisions_dir
|> Path.join("*.yaml")
|> Path.wildcard()
|> Map.new(fn path ->
code = Path.basename(path, ".yaml")
subdivisions =
path
|> YamlElixir.read_from_file!()
|> Map.new(fn {id, data} -> {String.upcase(id), convert_subdivision(id, data)} end)
{code, subdivisions}
end)
end
defp convert_subdivision(id, data) do
%Subdivision{
id: id,
name: data["name"],
unofficial_names: data["unofficial_names"],
translations: atomize_keys(data["translations"]),
geo: atomize_keys(data["geo"])
}
end
defp atomize_keys(nil), do: nil
defp atomize_keys(map) when is_map(map) do
Map.new(map, fn {k, v} -> {String.to_atom(k), atomize_keys(v)} end)
end
defp atomize_keys(value), do: value
end