defmodule ICalendarTimezones.Backend do @moduledoc """ Module that loads the timezone information """ @zone_list_path "libical/zoneinfo/zones.tab" @doc """ Loads and returns all of the timezone's data """ @spec timezones_data :: map() def timezones_data do Enum.reduce(timezones_list(), %{}, fn tz_id, acc -> Map.put(acc, tz_id, vtimezone(tz_id)) end) end @doc """ Retuns the list of IANA timezones identifiers """ @spec timezones_list :: list(String.t()) def timezones_list do @zone_list_path |> File.stream!() |> Stream.map(&String.trim/1) |> Stream.map(&String.split/1) |> Stream.map(&List.last/1) |> Enum.to_list() end @doc """ Returns the VCALENDAR vobject data for a TZID. """ @spec vtimezone(String.t()) :: String.t() def vtimezone(tz_id) when is_binary(tz_id) do tz_id |> path() |> read_file() end @spec path(String.t()) :: String.t() defp path(tz_id) when is_binary(tz_id) do Path.join("libical/zoneinfo", tz_id <> ".ics") end @spec read_file(String.t()) :: String.t() defp read_file(path) when is_binary(path) do File.read!(path) end end