Modular, context-aware and aspect-oriented dendritic Nix configurations.
Discussions: https://oeiuwq.zulipchat.com/join/nqp26cd4kngon6mo3ncgnuap/
den.oeiuwq.com
configurations
den
dendritic
nix
aspect
oriented
1{ lib, den, ... }:
2let
3 description = ''
4 Defines a user at OS and Home levels.
5
6 Works in NixOS/Darwin and standalone Home-Manager
7
8 ## Usage
9
10 # for NixOS/Darwin
11 den.aspects.my-user.includes = [ den._.define-user ]
12
13 # for standalone home-manager
14 den.aspects.my-home.includes = [ den._.define-user ]
15
16 or globally (automatically applied depending on context):
17
18 den.default.includes = [ den._.define-user ]
19 '';
20
21 homeDir =
22 host: user:
23 if lib.hasSuffix "darwin" host.system then "/Users/${user.userName}" else "/home/${user.userName}";
24
25 userContext =
26 { host, user, ... }:
27 {
28 nixos.users.users.${user.userName}.isNormalUser = true;
29 darwin.users.users.${user.userName} = {
30 name = user.userName;
31 home = homeDir host user;
32 };
33 homeManager = {
34 home.username = user.userName;
35 home.homeDirectory = homeDir host user;
36 };
37 };
38
39 hmContext =
40 { home, ... }:
41 userContext {
42 host.system = home.system;
43 user.userName = home.userName;
44 };
45in
46{
47 den.provides.define-user = {
48 inherit description;
49 includes = [
50 userContext
51 hmContext
52 ];
53 __functor = den.lib.parametric true;
54 };
55}