-
Notifications
You must be signed in to change notification settings - Fork 20
/
flake.nix
86 lines (81 loc) · 2.85 KB
/
flake.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
{
description = "Nickel shim for Nix";
inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.flake-compat.url = "github:edolstra/flake-compat";
inputs.flake-compat.flake = false;
nixConfig = {
extra-substituters = [
"https://organist.cachix.org"
];
extra-trusted-public-keys = [
"organist.cachix.org-1:GB9gOx3rbGl7YEh6DwOscD1+E/Gc5ZCnzqwObNH2Faw="
];
};
outputs = {
self,
nixpkgs,
flake-utils,
flake-compat,
} @ inputs: let
# Generate typical flake outputs from .ncl files in path for provided systems (default from flake-utils):
#
# apps.${system}.regenerate-lockfile generated from optional lockFileContents argument,
# defaulting to `organist` pointing to this flake
# devShells.${system} and packages.${system} generated from project.ncl
#
# (to be extended with more features later)
outputsFromNickel = baseDir: flakeInputs: {
systems ? flake-utils.lib.defaultSystems,
lockFileContents ? {
organist = "${self}/lib/organist.ncl";
},
}:
flake-utils.lib.eachSystem systems (system: let
lib = self.lib.${system};
nickelOutputs = lib.importNcl {
inherit baseDir flakeInputs lockFileContents;
};
in
# Can't do just `{inherit nickelOutputs;} // nickelOutputs.flake` because of infinite recursion over self
if (! builtins.readDir baseDir ? "project.ncl")
then {}
else {
inherit nickelOutputs;
packages = nickelOutputs.packages or {};
checks = nickelOutputs.checks or {};
# Can't define this app in Nickel, yet
apps =
{
regenerate-lockfile = lib.regenerateLockFileApp lockFileContents;
}
// nickelOutputs.apps or {};
devShells = nickelOutputs.devShells or {};
});
computedOutputs = outputsFromNickel ./. (inputs // {organist = self;}) {
lockFileContents.organist = "./lib/organist.ncl";
};
in
{
templates.default = {
path = ./templates/default;
description = "A devshell using nickel.";
welcomeText = ''
You have just created an _Organist_-powered development shell.
- Enter the environment with `nix develop`
- Tweak it by modifying `project.ncl`
_Hint_: To be able to leverage the Nickel language server for instant feedback on your configuration, run `nix run .#regenerate-lockfile` first.
'';
};
flake.outputsFromNickel = outputsFromNickel;
}
// computedOutputs
// flake-utils.lib.eachDefaultSystem (
system: {
lib = nixpkgs.legacyPackages.${system}.callPackage ./lib/lib.nix {
organistSrc = self;
nickel = inputs.nixpkgs.legacyPackages."${system}".nickel;
};
}
);
}