defmodule Argos.Application do @moduledoc """ Arranque de la aplicación Argos. Configura el handler de Logger personalizado y, según la configuración, inicia el sistema paralelo y el Circuit Breaker bajo `Argos.Supervisor`. ## Children del Supervisor - `Argos.Command.CircuitBreaker`: Circuit breaker para comandos del sistema - `Argos.Parallel.Supervisor`: Sistema de ejecución paralela (opcional, según configuración) ## Configuración El sistema paralelo se inicia automáticamente a menos que: - `config :argos, :start_parallel_system, false` esté configurado - O el entorno sea `:test` """ use Application @impl true def start(_type, _args) do setup_logger() children = parallel_children() opts = [strategy: :one_for_one, name: Argos.Supervisor] Supervisor.start_link(children, opts) end defp parallel_children do base_children = [ {Argos.Command.CircuitBreaker, []} ] if should_start_parallel_system?() do base_children ++ [Argos.Parallel.Supervisor] else base_children end end defp setup_logger do case :logger.get_handler_config(Argos.Logger) do {:error, {:not_found, _}} -> :logger.add_handler(Argos.Logger, Argos.Logger, %{}) _ -> :ok end level = Application.get_env(:logger, :level, :debug) :logger.set_primary_config(:level, level) end defp should_start_parallel_system? do case Application.get_env(:argos, :start_parallel_system) do nil -> Application.get_env(:argos, :env, :dev) != :test value -> value end end end