1# Test:
2# ./meta-maintainers/test.nix
3{ lib, ... }:
4let
5 inherit (lib)
6 mkOption
7 mkOptionType
8 types
9 ;
10
11 maintainer = mkOptionType {
12 name = "maintainer";
13 check = email: lib.elem email (lib.attrValues lib.maintainers);
14 merge = loc: defs: {
15 # lib.last: Perhaps this could be merged instead, if "at most once per module"
16 # is a problem (see option description).
17 ${(lib.last defs).file} = (lib.last defs).value;
18 };
19 };
20
21 listOfMaintainers = types.listOf maintainer // {
22 merge =
23 loc: defs:
24 lib.zipAttrs (
25 lib.flatten (
26 lib.imap1 (
27 n: def:
28 lib.imap1 (
29 m: def':
30 maintainer.merge (loc ++ [ "[${toString n}-${toString m}]" ]) [
31 {
32 inherit (def) file;
33 value = def';
34 }
35 ]
36 ) def.value
37 ) defs
38 )
39 );
40 };
41in
42{
43 _class = null; # not specific to NixOS
44 options = {
45 meta = {
46 maintainers = mkOption {
47 type = listOfMaintainers;
48 default = [ ];
49 example = lib.literalExpression ''[ lib.maintainers.alice lib.maintainers.bob ]'';
50 description = ''
51 List of maintainers of each module.
52 This option should be defined at most once per module.
53
54 The option value is not a list of maintainers, but an attribute set that maps module file names to lists of maintainers.
55 '';
56 };
57 };
58 };
59 meta.maintainers = with lib.maintainers; [
60 pierron
61 roberth
62 ];
63}