main
 1{
 2  lib,
 3  config,
 4  pkgs,
 5  ...
 6}: {
 7  options = {
 8    xdg.user-dirs = {
 9      enable = lib.mkEnableOption "Whether to manage `$XDG_CONFIG_HOME/user-dirs.dirs`";
10      package = lib.mkPackageOption pkgs "xdg-user-dirs" {nullable = true;};
11      setSessionVariables = lib.mkEnableOption "Whether to set the XDG user dir environment variables";
12      directories = lib.mkOption {
13        type = lib.types.lazyAttrsOf lib.types.str;
14        description = "All user directories";
15        default = {
16          desktop = "${config.directory}/Desktop";
17          documents = "${config.directory}/Documents";
18          download = "${config.directory}/Downloads";
19          music = "${config.directory}/Music";
20          pictures = "${config.directory}/Pictures";
21          projects = "${config.directory}/Projects";
22          publicShare = "${config.directory}/publicShare";
23          templates = "${config.directory}/Templates";
24          videos = "${config.directory}/Videos";
25        };
26      };
27    };
28  };
29  config = let
30    cfg = config.xdg.user-dirs;
31    mkXDGVariable = dirs:
32      lib.mapAttrs'
33      (dir: path: lib.nameValuePair "XDG_${lib.strings.toUpper dir}_DIR" path)
34      dirs;
35  in
36    lib.mkIf cfg.enable {
37      packages = lib.optional (cfg.package != null) cfg.package;
38
39      xdg.config.files."user-dirs.dirs" = {
40        generator = lib.generators.toKeyValue {};
41        value = lib.mapAttrs (_: dir: ''"${dir}"'') (mkXDGVariable cfg.directories);
42      };
43      xdg.config.files."user-dirs.conf".text = "enabled=False";
44
45      environment.sessionVariables = lib.mkIf cfg.setSessionVariables (mkXDGVariable cfg.directories);
46    };
47}