{ pkgs, lib, config, ... }: with lib; with types; { options = { device = mkOption { type = strMatching "[A-z|0-9]*-(Laptop|Workstation|VM)"; }; devices = mkOption { type = attrs; }; deviceSpecific = mkOption { type = attrs; }; }; config = { deviceSpecific = let device = config.device; devInfo = config.devices.${config.device}; in rec { isLaptop = (!isNull (builtins.match ".*Laptop" device)); smallScreen = (device == "Prestigio-Laptop"); isShared = device == "Lenovo-Workstation"; cpu = devInfo.cpu.vendor; inherit devInfo; isSSD = devInfo.drive.type == "ssd"; # Whether machine is powerful enough for heavy stuff goodMachine = devInfo.cpu.clock * devInfo.cpu.cores >= 4000 && devInfo.drive.size >= 100 && devInfo.ram >= 8; isHost = isSSD; bigScreen = devInfo ? bigScreen; }; devices = { T490s-Laptop = { cpu = { vendor = "intel"; clock = 4600; cores = 4; }; drive = { type = "ssd"; speed = 2000; size = 250; }; ram = 16; }; T420-Laptop = { legacy = false; cpu = { vendor = "intel"; clock = 2500; cores = 2; }; drive = { type = "ssd"; speed = 1000; size = 120; }; ram = 8; }; Lenovo-Workstation = { legacy = true; cpu = { vendor = "intel"; clock = 2500; cores = 2; }; drive = { type = "ssd"; speed = 250; size = 120; }; ram = 8; }; AMD-Workstation = { cpu = { vendor = "amd"; clock = 4200; cores = 8; }; drive = { type = "ssd"; speed = 6000; size = 250; }; bigScreen = true; ram = 32; }; Prestigio-Laptop = { cpu = { vendor = "intel"; clock = 1400; cores = 2; }; drive = { type = "flash"; speed = 100; size = 32; }; ram = 2; }; NixOS-VM = { cpu = { vendor = "intel"; clock = 1000; cores = 1; }; drive = { type = "ssd"; speed = 50; size = 1; }; ram = 4; }; }; }; }