grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / programs / yabar.nix
blobee8370b569147888c8b3e7e21593aeecb5b61e0d
1 { lib, pkgs, config, ... }:
3 let
4   cfg = config.programs.yabar;
6   mapExtra = v: lib.concatStringsSep "\n" (lib.mapAttrsToList (
7     key: val: "${key} = ${if (builtins.isString val) then "\"${val}\"" else "${builtins.toString val}"};"
8   ) v);
10   listKeys = r: builtins.concatStringsSep "," (builtins.map (n: "\"${n}\"") (builtins.attrNames r));
12   configFile = let
13     bars = lib.mapAttrsToList (
14       name: cfg: ''
15         ${name}: {
16           font: "${cfg.font}";
17           position: "${cfg.position}";
19           ${mapExtra cfg.extra}
21           block-list: [${listKeys cfg.indicators}]
23           ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (
24             name: cfg: ''
25               ${name}: {
26                 exec: "${cfg.exec}";
27                 align: "${cfg.align}";
28                 ${mapExtra cfg.extra}
29               };
30             ''
31           ) cfg.indicators)}
32         };
33       ''
34     ) cfg.bars;
35   in pkgs.writeText "yabar.conf" ''
36     bar-list = [${listKeys cfg.bars}];
37     ${builtins.concatStringsSep "\n" bars}
38   '';
40   {
41     options.programs.yabar = {
42       enable = lib.mkEnableOption "yabar, a status bar for X window managers";
44       package = lib.mkOption {
45         default = pkgs.yabar-unstable;
46         defaultText = lib.literalExpression "pkgs.yabar-unstable";
47         example = lib.literalExpression "pkgs.yabar";
48         type = lib.types.package;
50         # `yabar-stable` segfaults under certain conditions.
51         # remember to update yabar.passthru.tests if nixos switches back to it!
52         apply = x: if x == pkgs.yabar-unstable then x else lib.flip lib.warn x ''
53           It's not recommended to use `yabar' with `programs.yabar', the (old) stable release
54           tends to segfault under certain circumstances:
56           * https://github.com/geommer/yabar/issues/86
57           * https://github.com/geommer/yabar/issues/68
58           * https://github.com/geommer/yabar/issues/143
60           Most of them don't occur on master anymore, until a new release is published, it's recommended
61           to use `yabar-unstable'.
62         '';
64         description = ''
65           The package which contains the `yabar` binary.
67           Nixpkgs provides the `yabar` and `yabar-unstable`
68           derivations since 18.03, so it's possible to choose.
69         '';
70       };
72       bars = lib.mkOption {
73         default = {};
74         type = lib.types.attrsOf(lib.types.submodule {
75           options = {
76             font = lib.mkOption {
77               default = "sans bold 9";
78               example = "Droid Sans, FontAwesome Bold 9";
79               type = lib.types.str;
81               description = ''
82                 The font that will be used to draw the status bar.
83               '';
84             };
86             position = lib.mkOption {
87               default = "top";
88               example = "bottom";
89               type = lib.types.enum [ "top" "bottom" ];
91               description = ''
92                 The position where the bar will be rendered.
93               '';
94             };
96             extra = lib.mkOption {
97               default = {};
98               type = lib.types.attrsOf lib.types.str;
100               description = ''
101                 An attribute set which contains further attributes of a bar.
102               '';
103             };
105             indicators = lib.mkOption {
106               default = {};
107               type = lib.types.attrsOf(lib.types.submodule {
108                 options.exec = lib.mkOption {
109                   example = "YABAR_DATE";
110                   type = lib.types.str;
111                   description = ''
112                      The type of the indicator to be executed.
113                   '';
114                 };
116                 options.align = lib.mkOption {
117                   default = "left";
118                   example = "right";
119                   type = lib.types.enum [ "left" "center" "right" ];
121                   description = ''
122                     Whether to align the indicator at the left or right of the bar.
123                   '';
124                 };
126                 options.extra = lib.mkOption {
127                   default = {};
128                   type = lib.types.attrsOf (lib.types.either lib.types.str lib.types.int);
130                   description = ''
131                     An attribute set which contains further attributes of a indicator.
132                   '';
133                 };
134               });
136               description = ''
137                 Indicators that should be rendered by yabar.
138               '';
139             };
140           };
141         });
143         description = ''
144           List of bars that should be rendered by yabar.
145         '';
146       };
147     };
149     config = lib.mkIf cfg.enable {
150       systemd.user.services.yabar = {
151         description = "yabar service";
152         wantedBy = [ "graphical-session.target" ];
153         partOf = [ "graphical-session.target" ];
155         script = ''
156           ${cfg.package}/bin/yabar -c ${configFile}
157         '';
159         serviceConfig.Restart = "always";
160       };
161     };
162   }