summaryrefslogtreecommitdiff
path: root/modules/flake/workflowLib.nix
blob: d8cc4c429f55bd9bf9587b154fdda36eb78e0b37 (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
lib: {
  self,
  platforms ? {
    "x86_64-linux" = {
      os = "ubuntu-latest";
      arch = "x64";
    };

    "aarch64-linux" = {
      os = "ubuntu-latest";
      arch = "aarch64";
    };

    "x86_64-darwin" = {
      os = "macos-latest";
      arch = "x64";
    };
  },
  ...
}: let
  inherit
    (lib)
    flatten
    getAttrs
    mapAttrsToList
    warn
    ;

  platforms' =
    platforms
    // {
      fallback = warn "an output in the job matrix is not supported!" {
        os = null;
        arch = null;
      };
    };

  mkMatrixMulti = systems: output:
    flatten (
      mapAttrsToList (
        system:
          mapAttrsToList (
            attr: _: {
              inherit (platforms'.${system} or platforms'.fallback) arch os;
              attr = "${output}.${system}.${attr}";
            }
          )
      )
      (getAttrs systems self.${output})
    );

  mkMatrixFlat = {
    output,
    suffix ? "",
  }:
    mapAttrsToList (
      attr: deriv: {
        inherit (platforms'.${deriv.pkgs.system} or platforms'.fallback) os arch;
        attr = "${output}.${attr}${suffix}";
      }
    )
    self.${output};

  mkMatrixSystem = output:
    mkMatrixFlat {
      inherit output;
      suffix = ".config.system.build.toplevel";
    };

  mkMatrixUser = mkMatrixFlat {
    output = "homeConfigurations";
    suffix = ".activationPackage";
  };
in {
  inherit
    mkMatrixMulti
    mkMatrixFlat
    mkMatrixSystem
    mkMatrixUser
    ;

  platforms = platforms';

  mkMatrix = {
    output,
    systems ? (builtins.attrNames platforms),
  }:
    {
      "nixosConfigurations" = mkMatrixSystem output;
      "darwinConfigurations" = mkMatrixSystem output;
      "homeConfigurations" = mkMatrixUser;
    }
    .${output}
    or (mkMatrixMulti systems output);
}