{ config, lib, pkgs, ... }: with lib; let cfg = config.graylog.pipeline; in { options.graylog.pipeline = mkOption { default = { }; type = with types; attrsOf (submodule ({ name, ... }: { options = { name = mkOption { type = with types; str; default = name; description = '' name of the pipeline ''; }; streamId = mkOption { type = with types; nullOr str; default = null; example = "000000000000000001"; description = '' stream id on which this pipeline should operate dont use terraform references here. ''; }; description = mkOption { type = with types; str; default = ""; description = '' description of the pipeline ''; }; # todo : create proper module system here source = mkOption { type = with types; str; description = '' source of the pipeline (without the header and the end) ''; }; }; })); }; config = let allPipelines = cfg; allPipelineConnections = mapAttrsToList (name: values: { "${values.streamId}" = "\${graylog_pipeline.${name}.id}"; }) (filterAttrs (name: values: values.streamId != null) allPipelines); collected = foldAttrs (n: a: [ n ] ++ a) [ ] allPipelineConnections; in mkIf (cfg != { }) { # create pipelines resource."graylog_pipeline" = mapAttrs (name: pipelineConfig: { source = '' pipeline "${pipelineConfig.name}" ${pipelineConfig.source} end ''; description = pipelineConfig.description; }) allPipelines; resource."graylog_pipeline_connection" = let mapping = filter (name: builtins.match ".*\\$.*" name != null) (builtins.attrNames collected); in mkAssert (mapping == [ ]) '' graylog.pipeline..streamId = ${concatStringsSep "\n " mapping} is not valid. use graylog.stream..pipelines instead '' (mapAttrs (name: pipelineConfig: { stream_id = name; pipeline_ids = pipelineConfig; }) collected); }; }