nixos-config/lib/default.nix

103 lines
3.3 KiB
Nix
Raw Normal View History

# All of the custom functions used for this configuration.
{ lib }:
2021-12-06 09:55:40 +00:00
rec {
/* Create an attribute set that represents the structure of the modules
inside of a directory. While it can recurse into directories, it will
stop once it detects `default.nix` inside.
2021-11-27 08:04:01 +00:00
Signature:
path -> attrset
Where:
- `path` is the starting point.
Returns:
An attribute set. The keys are the basename of the file or the directory
and the values are the filepath to the Nix file.
!!! Implementation detail is based from
https://github.com/divnix/digga/blob/main/src/importers.nix looking at it
multiple times for the purpose of familiarizing myself to coding in Nix
and functional programming shtick.
Example:
filesToAttr ./hosts
=> { ni = ./hosts/ni/default.nix; zilch = ./hosts/zilch/default.nix }
*/
filesToAttr = dirPath:
let
isModule = file: type:
2021-11-25 13:45:48 +00:00
(type == "regular" && lib.hasSuffix ".nix" file)
|| (type == "directory");
collect = file: type: {
name = lib.removeSuffix ".nix" file;
2021-11-25 13:45:48 +00:00
value = let path = dirPath + "/${file}";
in if (type == "regular")
|| (type == "directory" && lib.pathExists (path + "/default.nix")) then
path
else
filesToAttr path;
};
files = lib.filterAttrs isModule (builtins.readDir dirPath);
2021-11-25 13:45:48 +00:00
in lib.filterAttrs (name: value: value != { })
(lib.mapAttrs' collect files);
2021-11-30 01:03:05 +00:00
/* Collect all modules (results from `filesToAttr`) into a list.
Signature:
attrs -> [ function ]
Where:
- `attrs` is the set of modules and their path.
Returns:
- A list of imported modules.
Example:
modulesToList (filesToAttr ../modules)
=> [ <lambda> <lambda> <lambda> ]
*/
modulesToList = attrs:
let paths = lib.collect builtins.isPath attrs;
in builtins.map (path: import path) paths;
2021-11-29 09:58:02 +00:00
/* Return an attribute set of valid users from a given list of users.
2021-12-06 07:27:51 +00:00
This is a convenience function for getting users from the `./users` directory.
2021-11-29 09:58:02 +00:00
Signature:
list -> attrset
Where:
- `list` is a list of usernames as strings
- `attrset` is a set of valid users with the name as the key and the path as the value.
Example:
2021-12-26 08:02:57 +00:00
# Assuming only 'foo-dogsquared' is the existing user for 'home-manager'.
2021-12-06 07:27:51 +00:00
getUsers "home-manager" [ "foo-dogsquared" "archie" "brad" ]
2021-11-29 09:58:02 +00:00
=> { foo-dogsquared = /home/foo-dogsquared/projects/nixos-config/users/foo-dogsquared; }
*/
2021-12-06 07:27:51 +00:00
getUsers = type: users:
let
2021-12-06 07:27:51 +00:00
userModules = filesToAttr ../users/${type};
2021-11-30 01:03:05 +00:00
invalidUsernames = [ "config" "modules" ];
2021-12-26 08:02:57 +00:00
in lib.filterAttrs (n: _: !lib.elem n invalidUsernames && lib.elem n users) userModules;
# Return the path of `user` from `type`.
getUser = type: user:
lib.getAttr user (getUsers type [ user ]);
# Return the path of `secrets` from `../secrets`.
getSecret = path: ../secrets/${path};
/* Count the attributes with the given predicate.
Examples:
countAttrs (name: value: value) { d = true; f = true; a = false; }
2021-12-06 07:27:51 +00:00
=> 2
countAttrs (name: value: value.enable) { d = { enable = true; }; f = { enable = false; package = [ ]; }; }
=> 1
*/
countAttrs = pred: attrs:
2021-11-25 13:45:48 +00:00
lib.count (attr: pred attr.name attr.value)
(lib.mapAttrsToList lib.nameValuePair attrs);
}