{ lib, config, options, ... }: let driveModule = lib.types.submodule { options = { name = lib.mkOption { type = lib.types.str; description = '' The path of the drive. Note that a / is already added at the beginning. ''; default = ""; example = "drive2"; }; drive = lib.mkOption { type = lib.types.attrsOf lib.types.anything; description = "The attrs of the drive"; default = { }; example = { device = "/dev/disk/by-label/DRIVE2"; fsType = "ext4"; options = [ "noatime" "nodiratime" "discard" ]; }; }; }; }; in { options.mods = { drives = { useSwap = { enable = lib.mkOption { default = true; example = false; type = lib.types.bool; description = '' Use default drive config ''; }; }; defaultDrives = { enable = lib.mkOption { default = true; example = false; type = lib.types.bool; description = '' Use default drive config ''; }; }; extraDrives = lib.mkOption { default = [ ]; example = [ { name = "drive2"; drive = { device = "/dev/disk/by-label/DRIVE2"; fsType = "ext4"; options = [ "noatime" "nodiratime" "discard" ]; }; } ]; # TODO: how to make this work # type = with lib.types; listOf (attrsOf driveModule); type = with lib.types; listOf (attrsOf anything); description = '' Extra drives to add. ''; }; }; }; config = ( lib.optionalAttrs (options ? fileSystems) { fileSystems = builtins.listToAttrs ( map ( { name, drive }: { name = "/" + name; value = drive; } ) config.mods.drives.extraDrives ) // (lib.optionalAttrs config.mods.drives.defaultDrives.enable) { "/" = { device = "/dev/disk/by-label/ROOT"; fsType = "btrfs"; options = [ "noatime" "nodiratime" "discard" ]; }; "/boot" = { device = "/dev/disk/by-label/BOOT"; fsType = "vfat"; options = [ "rw" "fmask=0022" "dmask=0022" "noatime" ]; }; "/home" = { device = "/dev/disk/by-label/HOME"; fsType = "btrfs"; options = [ "noatime" "nodiratime" "discard" ]; }; }; # TODO make this convert to choice of drives -> thanks to funny types this doesn't work... swapDevices = lib.mkIf config.mods.drives.useSwap.enable [ { device = "/dev/disk/by-label/SWAP"; } ]; } ); }