defmodule WarframeWorldstateDataElixirTools.DataBundle do @moduledoc false @doc """ Reads a data file and retuns its content in a map. Arguments: 1. The file name without the extention. 2. A locale in atom form. :en is used as a default. ## Examples iex> {:ok, nodes} = WarframeWorldstateDataElixirTools.DataBundle.read_data_file("solNodes.json") iex> is_map(nodes) true iex> WarframeWorldstateDataElixirTools.DataBundle.read_data_file("nonexistent.json") {:error, :enoent} """ @spec read_data_file(String.t(), atom()) :: {:ok, map()} | {:error, Jason.DecodeError.t() | term()} def read_data_file(file_name, locale \\ :en) when is_binary(file_name) and is_atom(locale) do path = case locale do :en -> :code.priv_dir(:warframe_worldstate_data_elixir_tools) |> Path.join("data/#{file_name}") _ -> :code.priv_dir(:warframe_worldstate_data_elixir_tools) |> Path.join("data/#{Atom.to_string(locale)}/#{file_name}") end with {:ok, res} <- File.read(path), {:ok, map} <- Jason.decode(res) do {:ok, map} else {:error, _reason} = x -> x end end @doc """ Finds the value of a top-level key in a large JSON file without loading the entire file into memory. ## Examples iex> key = "/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsEasy" iex> {:ok, %{"value" => value}} = WarframeWorldstateDataElixirTools.DataBundle.find_key("languages.json", key, :en) iex> value "Starve the beast" iex> WarframeWorldstateDataElixirTools.DataBundle.find_key("languages.json", "nonexistent_key", :en) {:error, :not_found} """ def find_key(file_name, key, locale) when is_binary(file_name) and is_atom(locale) and is_binary(key) do path = case locale do :en -> :code.priv_dir(:warframe_worldstate_data_elixir_tools) |> Path.join("data/#{file_name}") _ -> :code.priv_dir(:warframe_worldstate_data_elixir_tools) |> Path.join("data/#{Atom.to_string(locale)}/#{file_name}") end path_expr = [:root, key] path |> File.stream!(4096, []) |> Jaxon.Stream.from_enumerable() |> Jaxon.Stream.query(path_expr) |> Enum.take(1) |> case do [value] -> {:ok, value} [] -> {:error, :not_found} end end end