{ config, lib, ... }: let cfg = config.zfs-root.fileSystems; inherit (lib) types mkDefault mkOption mkMerge mapAttrsToList; in { options.zfs-root.fileSystems = { datasets = mkOption { description = "Set mountpoint for datasets"; type = types.attrsOf types.str; default = {}; }; bindmounts = mkOption { description = "Set mountpoint for bindmounts"; type = types.attrsOf types.str; default = {}; }; efiSystemPartitions = mkOption { description = "Set mountpoint for efi system partitions"; type = types.listOf types.str; default = []; }; swapPartitions = mkOption { description = "Set swap partitions"; type = types.listOf types.str; default = []; }; }; config.fileSystems = mkMerge (mapAttrsToList (dataset: mountpoint: { "${mountpoint}" = { device = "${dataset}"; fsType = "zfs"; options = ["X-mount.mkdir" "noatime"]; neededForBoot = true; }; }) cfg.datasets ++ mapAttrsToList (bindsrc: mountpoint: { "${mountpoint}" = { device = "${bindsrc}"; fsType = "none"; options = ["bind" "X-mount.mkdir" "noatime"]; }; }) cfg.bindmounts ++ map (esp: { "/boot/efis/${esp}" = { device = "${config.zfs-root.boot.devNodes}${esp}"; fsType = "vfat"; options = [ "x-systemd.idle-timeout=1min" "x-systemd.automount" "noauto" "nofail" "noatime" "X-mount.mkdir" ]; }; }) cfg.efiSystemPartitions); config.swapDevices = mkDefault (map (swap: { device = "${config.zfs-root.boot.devNodes}${swap}"; discardPolicy = mkDefault "both"; randomEncryption = { enable = true; allowDiscards = mkDefault true; }; }) cfg.swapPartitions); }