summaryrefslogtreecommitdiff
path: root/module.nix
blob: 8c7cb02c005b4f5ae92a1f4b46c5b67cf781e499 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
workflowLib': {
  config,
  lib,
  self,
  ...
}: let
  cfg = config.githubWorkflowGenerator;

  inherit
    (lib)
    attrNames
    concatLists
    elem
    filter
    mdDoc
    mkIf
    mkOption
    literalExpression
    types
    ;

  workflowLib = workflowLib' (
    {inherit self;}
    // mkIf (cfg.platforms != {}) {
      inherit (cfg) platforms;
    }
  );

  supportedOutputs = [
    "apps"
    "checks"
    "devShells"
    "darwinConfigurations"
    "homeConfigurations"
    "nixosConfigurations"
    "packages"
  ];

  platformMap = {
    options = {
      arch = mkOption {
        description = mdDoc "the architecture of a system";
        type = types.str;
        default = null;
        example = literalExpression "x86_64";
      };

      os = mkOption {
        description = mdDoc "the name of an os supported by github runners";
        type = types.str;
        default = null;
        example = literalExpression "ubuntu-latest";
      };
    };
  };

  overrides = {
    options = {
      systems = mkOption {
        description = mdDoc "list of systems to build an output for";
        type = types.listOf types.str;
        default = attrNames cfg.platforms;
      };
    };
  };

  unfilteredJobs = concatLists (
    map (
      output:
        workflowLib.mkMatrix (
          {inherit output;} // cfg.overrides.${output} or {}
        )
    )
    cfg.outputs
  );
in {
  options = {
    githubWorkflowGenerator = {
      outputs = mkOption {
        description = mdDoc "outputs to include in workflow";
        type = types.listOf types.str;
        default = filter (output: elem output supportedOutputs) (attrNames self);
      };

      platforms = mkOption {
        description = mdDoc ''
          an attrset that can map a nix system to an architecture and os supported by github
        '';
        type = types.attrsOf (types.submodule platformMap);
        default = {};
      };

      exclude = mkOption {
        description = mdDoc "outputs to exclude from matrix";
        type = types.listOf types.str;
        default = [];
        example = literalExpression ''
          {
            githubWorkflowGenerator.exclude = [
           	  "packages.x86_64-linux.foo"
           	];
          }
        '';
      };

      overrides = mkOption {
        description = mdDoc "overrides for mkMatrix args";
        type = types.attrsOf (types.submodule overrides);
        default = {};
        example = literalExpression ''
          {
            githubWorkflowGenerator.overrides = {
              checks.systems = [ "x86_64-linux" ];
            };
          }
        '';
      };
    };
  };

  config.flake.githubWorkflow = {
    matrix.include = filter (job: !builtins.elem job.attr cfg.exclude) unfilteredJobs;
  };
}