flake/meta/mkLocalModule.nix
2024-09-16 00:10:42 +02:00

71 lines
2.3 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{lib, ...}: { config.lyn.lib = rec {
/**
Split a string, and return all elements after a marker.
# Example
```
splitAfterMarker "/" "modules" /home/user/flake/modules/abc/def
== ["abc" "def"]
```
*/
splitAfterMarker = splitter: marker: input: builtins.foldl' (acc: new:
if acc == false then # marker not found yet
if new == marker then [] /* marker found */ else false
else acc ++ [new] # marker already found, add to output list
) false (lib.splitString splitter input);
/**
Make a Nix module, with its attrpath being the local path
relative to a marker directory. Accepts a prefix, and removes `.nix` file endings.
# Example
```
mkLocalModuleMarker "modules" ["myModules" "abc"] ./current-file.nix "enable something" {}
{ myModules.abc.current.file.path.current-file.enable = true; }
```
*/
mkLocalModuleMarker = marker: prefix: currentPath: optDesc: moduleConfig: let
normalizedPath = lib.strings.removeSuffix ".nix" (builtins.toString currentPath);
attrPath = prefix ++ (splitAfterMarker "/" marker normalizedPath);
mod = {config, ...}: {
options = lib.setAttrsByPath attrPath (lib.mkEnableOption optDesc);
config = lib.mkIf (lib.getAttrByPath attrPath config) moduleConfig;
};
in mod;
/**
Find a folder or a parent folder containing a file.
# Example
```
findFolderWithFile "flake.nix" ./.
== /home/user/flake/
```
*/
findFolderWithFile = file: arg:
if builtins.pathExists (arg + "/" + file) then arg
else if arg == /. then throw "could not find folder containing ${file}"
else findFolderWithFile file (arg + "/..");
/**
Shorthand for mkLocalModuleMarker, setting marker to your flake and prefix to l.
*/
mkLocalModule = path: mkLocalModuleMarker (findFolderWithFile "flake.nix" path) ["lyn"] path;
};}
# foldl' op nul [x0 x1 x2 ...] = op (op (op nul x0) x1) x2) .... For example, foldl' (x: y: x + y) 0 [1 2 3]
# input = /home/alina/flake/desktop/common
# options.desktop.common
# input' = /nix/store/aaa-flake/desktop/common
# foldl' (split "/" input)
# marker = flake
# foldl' ([home alina flake modules audio.nix ])
# acc = false false [] [modules] [modules audio.nix]
# | ^ marker found
# | marker not found yet
# $ echo "abc\ndef" > readme
# readPathsFromFile "readme" == [./abc ./def]