diff --git a/2024/flake.nix b/2024/flake.nix index 593dc44..03eb7e5 100644 --- a/2024/flake.nix +++ b/2024/flake.nix @@ -60,12 +60,13 @@ # inherit build-drv build-script watch-script; # }; - legacyPackages = { - phil-1 = { - paper-1 = alexandriaLib.callTypstProject (import ./documents/by-course/phil-1/paper-1/package.nix); - }; - digression-linear-algebra = alexandriaLib.callTypstProject (import ./documents/by-name/digression-linear-algebra/package.nix); - }; + # legacyPackages = { + # phil-1 = { + # paper-1 = alexandriaLib.callTypstProject (import ./documents/by-course/phil-1/paper-1/package.nix); + # }; + # digression-linear-algebra = alexandriaLib.callTypstProject (import ./documents/by-name/digression-linear-algebra/package.nix); + # }; + legacyPackages = alexandriaLib.parsePkgs ./documents; # apps = rec { # default = watch; # build = flake-utils.lib.mkApp { diff --git a/2024/nix/lib/default.nix b/2024/nix/lib/default.nix index 4e43bfb..fdecf1d 100644 --- a/2024/nix/lib/default.nix +++ b/2024/nix/lib/default.nix @@ -16,4 +16,5 @@ rec { inherit cleanTypstSource; } ); + parsePkgs = (import ./parsePkgs.nix) (defaultArgs // { inherit callTypstProject; }); } diff --git a/2024/nix/lib/parsePkgs.nix b/2024/nix/lib/parsePkgs.nix new file mode 100644 index 0000000..d31776c --- /dev/null +++ b/2024/nix/lib/parsePkgs.nix @@ -0,0 +1,36 @@ +{ pkgs, callTypstProject, ... }: +baseDirectory: +let + inherit (pkgs) lib; + inherit (lib.attrsets) + mapAttrs + mapAttrsToList + mergeAttrsList + ; + inherit (builtins) readDir; +in +let + # Package files for a single shard + # Type: String -> String -> AttrsOf Path + namesForShard = + shard: type: + if type != "directory" then + # Ignore all non-directories. Technically only README.md is allowed as a file in the base directory, so we could alternatively: + # - Assume that README.md is the only file and change the condition to `shard == "README.md"` for a minor performance improvement. + # This would however cause very poor error messages if there's other files. + # - Ensure that README.md is the only file, throwing a better error message if that's not the case. + # However this would make for a poor code architecture, because one type of error would have to be duplicated in the validity checks and here. + # Additionally in either of those alternatives, we would have to duplicate the hardcoding of "README.md" + { } + else + mapAttrs (name: _: baseDirectory + "/${shard}/${name}/package.nix") ( + readDir (baseDirectory + "/${shard}") + ); + +in +# mapAttrs (a: b: builtins.trace (builtins.tryEval a) b) ( +# mergeAttrsList (mapAttrsToList namesForShard (readDir baseDirectory)) +# ) +mapAttrs (a: b: callTypstProject (import (/. + b))) ( + mergeAttrsList (mapAttrsToList namesForShard (readDir baseDirectory)) +)