defmodule Dragon.Data.Loader do
@moduledoc """
Load data from an elixir module... still cannot handle variable deps,
as Mix.install doesn't want to run from within Mix :table_flip:
"""
use Dragon.Context
import Dragon.Tools.Dict
import Dragon.Tools.File, only: [drop_root: 2, find_file: 2]
import Dragon.Data, only: [data_path: 2]
def load(%Dragon{} = dragon, %{type: "loader", path: path, into: into}) do
stdout([:green, "Loader ", :reset, :bright, drop_root(dragon.root, path)])
into = data_path(dragon.root, into)
with {:ok, path} <- find_file(dragon.root, path),
{:error, reason} <- run_loader(dragon, path, into) do
abort(reason)
end
end
def load(%Dragon{}, args), do: abort("Invalid loader args: #{inspect(args)}")
defp run_loader(dragon, path, into) do
if File.exists?(path) do
case Code.eval_file(path) do
{{:module, module, _, _}, _} ->
if Kernel.function_exported?(module, :load, 1) do
stdout([:green, "Loader ", :reset, :bright, "#{module}.load/1"])
case module.load(dragon) do
{:ok, data} ->
put_into(dragon, [:data] ++ into, data)
{:error, _} = pass ->
pass
error ->
IO.inspect(error, label: "Invalid Result")
{:error, "Invalid result from Loader"}
end
else
{:error, "Loader module #{module} does not have load/1 function"}
end
error ->
IO.inspect(error, label: "Load Error")
{:error, "Cannot load file '#{path}': Invalid contents"}
end
else
{:error, "Cannot find file '#{path}'"}
end
# rescue
# error ->
# IO.inspect(error)
# {:error, "Cannot load file '#{path}': #{error.description}"}
end
end