feat(lib): add admin user using custom lib function

This commit is contained in:
Mohammad Rafiq 2025-07-07 15:18:33 +08:00
parent 28d78dce61
commit d3ee4cc169
No known key found for this signature in database
2 changed files with 71 additions and 1 deletions

View file

@ -1,8 +1,16 @@
{ lib, inputs, ... }:
{
lib,
config,
inputs,
...
}:
let
inherit (lib.options) mkOption;
inherit (lib.types) path lazyAttrsOf raw;
inherit (inputs.flake-parts.lib) mkSubmoduleOptions;
inherit (cfg.lib.attrsets) firstAttrNameMatching;
cfg = config.flake;
username = firstAttrNameMatching (_: v: v.primary or false) cfg.manifest.users;
in
{
options.flake = mkSubmoduleOptions {
@ -14,5 +22,13 @@ in
type = path;
default = "";
};
admin = mkOption {
type = lazyAttrsOf raw;
default = { };
};
};
config.flake.admin = cfg.manifest.users.${username} // {
inherit username;
};
}

54
nix/lib/attrsets.nix Normal file
View file

@ -0,0 +1,54 @@
{ lib, ... }:
let
inherit (builtins) attrNames head;
inherit (lib.trivial) pipe;
inherit (lib.attrsets) filterAttrs;
in
{
flake.lib.attrsets = {
/**
`firstAttrNameMatching pred set` filters an attribute set `set` based on a predicate `pred`
and returns the *first* attribute name that satisfies the predicate.
# Example
```nix
let
mySet = {
a = { value = 1; };
b = { value = 2; };
c = { value = 3; };
};
isGreaterThanOne = name: value: value.value > 1;
result = firstAttrNameMatching isGreaterThanOne mySet;
in
result
# Output: "b"
```
# Type
```
firstAttrNameMatching :: (String -> Any -> Bool) -> AttrSet -> String
```
# Arguments
pred
: A function that takes an attribute name and its value and returns a boolean.
set
: The attribute set to filter.
*/
firstAttrNameMatching =
pred: set:
pipe set [
(filterAttrs pred)
attrNames
head
];
};
}