diff --git a/lib/options.nix b/lib/options.nix index a944a7d..5b08fe0 100644 --- a/lib/options.nix +++ b/lib/options.nix @@ -1,8 +1,8 @@ { lib }: let - inherit (lib) mkOption types; + inherit (lib) mkOption types flatten; in -{ +rec { mkOpt = type: default: mkOption { inherit type default; }; @@ -20,4 +20,12 @@ in type = types.bool; example = true; }; + + coercedPackageList = with types; + let + packageListType = listOf (either package packageListType); + in + coercedTo packageListType flatten (listOf package); + + packageListOpt = mkOpt coercedPackageList [ ]; } diff --git a/modules/global/options.nix b/modules/global/options.nix index 3444ae1..0d8d97f 100644 --- a/modules/global/options.nix +++ b/modules/global/options.nix @@ -38,7 +38,7 @@ in }; universe = { - packages = mkOpt (listOf package) [ ]; + packages = packageListOpt; shellAliases = mkOpt (attrsOf str) { }; variables = mkOpt (attrsOf (oneOf [ (listOf str) str path ])) { }; }; diff --git a/users/modules/global/programming.nix b/users/modules/global/programming.nix index b5c3152..effcb95 100644 --- a/users/modules/global/programming.nix +++ b/users/modules/global/programming.nix @@ -1,114 +1,157 @@ -{ pkgs, lib, ... }: +{ config, pkgs, lib, ... }: let - inherit (lib) flatten; + inherit (lib) flip; + inherit (lib.our) mkBoolOpt' packageListOpt; + + cfg = config.universe.programming; + + + programmingOpt' = kind: flip mkBoolOpt' "Programming: ${kind}"; + programmingOpt = flip programmingOpt' cfg.all.enable; + + addPackageLists = lib.mapAttrs (name: value: value // { + packages = packageListOpt; + }); in { - home.packages = with pkgs; flatten [ - editorconfig-core-c - editorconfig-checker + options.universe.programming = (addPackageLists { + base.enable = programmingOpt' "Base packages" true; - # C - gcc - gdb - clang-tools - binutils + c.enable = programmingOpt' "C" true; + csharp.enable = programmingOpt "C#"; + haskell.enable = programmingOpt "Haskell"; + java.enable = programmingOpt "Java"; + lua.enable = programmingOpt "Lua"; + nim.enable = programmingOpt "Nim"; + python.enable = programmingOpt' "Python" true; + racket.enable = programmingOpt "Racket"; + rust.enable = programmingOpt "Rust"; + zig.enable = programmingOpt "Zig"; + latex.enable = programmingOpt "LaTeX"; + html.enable = programmingOpt "HTML"; + }) // { + all.enable = programmingOpt' "All languages" false; + }; - # C Sharp - dotnetCorePackages.sdk_6_0 - omnisharp-roslyn - - # Haskell - haskell-language-server - ghc - cabal-install - ormolu - - (with haskellPackages; [ - hoogle - ]) - - stack - # stack2nix - cabal2nix - - # Java - openjdk - clang-tools - gradle - - # Lua - lua-language-server - - # Nim - nim - nimlsp - - # Python - (python312.withPackages (p: with p; [ - black - isort - jupyter - mypy - pip - pyflakes - pytest - - python-lsp-server - python-lsp-ruff - pylsp-rope - pyls-isort - ])) - pipenv - ruff - - # Racket - racket - - # Rust - (rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override { - extensions = [ - "rust-src" - "rust-analyzer" + config = { + universe.programming = with pkgs; { + base.packages = [ + editorconfig-core-c + editorconfig-checker ]; - })) - gcc - # Zig - zig - zls + c.packages = [ + gcc + gdb + clang-tools + binutils + ]; - # LaTeX - (texlive.combine { - inherit (texlive) - scheme-medium + csharp.packages = [ + dotnetCorePackages.sdk_6_0 + omnisharp-roslyn + ]; - apa7 - apacite - biblatex - biblatex-apa - biblatex-chicago - capt-of - minted - catchfile - endfloat - framed - fvextra - hanging - lipsum - mleftright - scalerel - threeparttable - upquote - wrapfig - xstring - ; - }) - biber + haskell.packages = with haskellPackages; [ + ghc + cabal-install + ormolu - # html - html-tidy - nodePackages.prettier - ]; + hoogle + + stack + # stack2nix + cabal2nix + ]; + + + java.packages = [ + openjdk + clang-tools + gradle + ]; + + lua.packages = [ + ]; + + nim.packages = [ + nim + ]; + + python.packages = [ + (python312.withPackages (p: with p; [ + black + isort + jupyter + mypy + pip + pyflakes + pytest + ])) + pipenv + ruff + ]; + + racket.packages = [ + racket + ]; + + rust.packages = [ + (rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override { + extensions = [ + "rust-src" + "rust-analyzer" + ]; + })) + gcc + ]; + + zig.packages = [ + zig + zls + ]; + + latex.packages = [ + (texlive.combine { + inherit (texlive) + scheme-medium + + apa7 + apacite + biblatex + biblatex-apa + biblatex-chicago + capt-of + minted + catchfile + endfloat + framed + fvextra + hanging + lipsum + mleftright + scalerel + threeparttable + upquote + wrapfig + xstring + ; + }) + biber + ]; + + html.packages = [ + html-tidy + nodePackages.prettier + ]; + }; + + home.packages = lib.concatMap + (v: lib.optionals (v ? packages && v.enable) v.packages) + (lib.attrValues cfg); + + programs.java.enable = cfg.java.enable; + + }; - programs.java.enable = true; }