defmodule EcsElixirCore.Supervisor do @moduledoc """ Supervisor for the EcsElixirCore application. This supervisor is responsible for starting and supervising the main components of the EcsElixirCore application. """ use Supervisor alias EcsElixirCore.Application.Features.BasicInfo.BasicInfoConfig alias EcsElixirCore.Application.Features.Masking.MaskingConfig alias EcsElixirCore.Application.Features.Request.RequestConfig alias EcsElixirCore.Application.Features.Response.ResponseConfig alias EcsElixirCore.Application.Features.Sampling.SamplingConfig alias EcsElixirCore.Domain.Shared.InternalLogging @ecs_error_code "ECS_ER32000-01" def start_link(opts \\ []) do Supervisor.start_link(__MODULE__, opts, name: __MODULE__) end @impl true def init(_opts) do case validate_startup_config() do :ok -> children = [ EcsElixirCore.Application.EcsMiddleware.PlugHandlerConfig, {Task.Supervisor, name: EcsLoggerTaskSupervisor} ] ++ resolver_supervisor_children() Supervisor.init(children, strategy: :one_for_one) {:error, reason} -> InternalLogging.log_error( "Startup configuration validation failed: #{reason}", __MODULE__ ) raise ArgumentError, reason end end defp validate_startup_config do with :ok <- MaskingConfig.validate_startup_config(), :ok <- SamplingConfig.validate_startup_config(), :ok <- RequestConfig.validate_startup_config(), :ok <- BasicInfoConfig.validate_startup_config(), :ok <- ResponseConfig.validate_startup_config() do :ok else {:error, reason} -> {:error, "#{@ecs_error_code}: #{reason}"} end end defp resolver_supervisor_children do [ %{ enable: SamplingConfig.sampling_enabled?(), children: [ EcsElixirCore.Infra.DrivenAdapters.EtsGenServer.Features.Sampling.Infra.EtsSamplingGenServer ] } ] |> Enum.filter(fn %{enable: enable} -> enable end) |> Enum.reduce([], fn %{children: children}, acc -> acc ++ children end) end end