defmodule Kraken.ProjectStart do alias Kraken.{Pipelines, Routes, Services} @default_config [ kraken_folder: "lib/kraken", define_services: true, start_services: true, define_pipelines: true, start_pipelines: true, define_routes: true ] def run() do case Application.get_env(:kraken, :project_start) do nil -> :ok false -> :ok [] -> :ok true -> do_run(@default_config) :ok configs when is_list(configs) -> do_run(configs) :ok end end defp do_run(configs) do define_and_start_services( Keyword.get(configs, :kraken_folder, false), Keyword.get(configs, :define_services, false), Keyword.get(configs, :start_services, false) ) define_and_start_pipelines( Keyword.get(configs, :kraken_folder, false), Keyword.get(configs, :define_pipelines, false), Keyword.get(configs, :start_pipelines, false) ) define_routes( Keyword.get(configs, :kraken_folder, false), Keyword.get(configs, :define_routes, false) ) end defp define_and_start_services(folder, true, start?) do (Path.relative_to_cwd(folder) <> "/services/*.json") |> Path.wildcard() |> Enum.map(fn file -> with {:ok, name} <- Services.define(File.read!(file)), true <- start?, {:ok, _state} <- Services.start(name) do :ok else false -> :ok {:error, error} -> raise error end end) end defp define_and_start_services(_folder, false, _start?), do: :ok defp define_and_start_pipelines(folder, true, start?) do (Path.relative_to_cwd(folder) <> "/pipelines/*.json") |> Path.wildcard() |> Enum.map(fn file -> with {:ok, name} <- Pipelines.define(File.read!(file)), true <- start?, {:ok, _state} <- Pipelines.start(name) do :ok else false -> :ok {:error, error} -> raise error end end) end defp define_and_start_pipelines(_folder, false, _start?), do: :ok defp define_routes(folder, true) do file = Path.relative_to_cwd(folder) <> "/routes.json" with {:ok, content} <- File.read(file), {:ok, Kraken.RoutingTable} <- Routes.define(content) do :ok else {:error, :enoent} -> {:error, :enoent} {:error, error} -> raise error end end defp define_routes(_folder, false), do: :ok end