feat(lib): add admin user using custom lib function
This commit is contained in:
parent
da6fa1b9df
commit
5d24a11990
2 changed files with 71 additions and 1 deletions
|
@ -1,8 +1,16 @@
|
||||||
{ lib, inputs, ... }:
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
inherit (lib.options) mkOption;
|
inherit (lib.options) mkOption;
|
||||||
inherit (lib.types) path lazyAttrsOf raw;
|
inherit (lib.types) path lazyAttrsOf raw;
|
||||||
inherit (inputs.flake-parts.lib) mkSubmoduleOptions;
|
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
|
in
|
||||||
{
|
{
|
||||||
options.flake = mkSubmoduleOptions {
|
options.flake = mkSubmoduleOptions {
|
||||||
|
@ -14,5 +22,13 @@ in
|
||||||
type = path;
|
type = path;
|
||||||
default = "";
|
default = "";
|
||||||
};
|
};
|
||||||
|
admin = mkOption {
|
||||||
|
type = lazyAttrsOf raw;
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.flake.admin = cfg.manifest.users.${username} // {
|
||||||
|
inherit username;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
54
nix/lib/attrsets.nix
Normal file
54
nix/lib/attrsets.nix
Normal 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
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue