Advent of Code solutions
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4 flakelight.url = "github:nix-community/flakelight";
5 crane.url = "github:ipetkov/crane";
6 fenix.url = "github:nix-community/fenix";
7 };
8
9 outputs = {
10 self,
11 nixpkgs,
12 flakelight,
13 crane,
14 fenix,
15 }: let
16 inherit (nixpkgs) lib;
17 selectToolchain = fenix: fenix.complete;
18 mkCrane = pkgs: let
19 inherit (selectToolchain pkgs.fenix) toolchain;
20 craneLib = (crane.mkLib nixpkgs.legacyPackages.${pkgs.system}).overrideToolchain toolchain;
21 rawSrc = ./.;
22 src = lib.fileset.toSource {
23 root = rawSrc;
24 fileset = lib.fileset.unions [
25 ./.config/hakari.toml
26 ./advent-hack
27 ./advent_core
28 ./src
29 ./macros
30 ./utils
31 ./years
32 ./Cargo.lock
33 ./Cargo.toml
34 ];
35 };
36 commonArgs = {
37 inherit src;
38 strictDeps = true;
39 };
40 cargoArtifacts = craneLib.buildDepsOnly commonArgs;
41 individualCrateArgs =
42 commonArgs
43 // {
44 inherit cargoArtifacts src;
45 inherit (craneLib.crateNameFromCargoToml {inherit src;}) version;
46 # NB: we disable tests since we'll run them all via cargo-nextest
47 doCheck = false;
48 };
49 buildCrate = pname:
50 craneLib.buildPackage (
51 individualCrateArgs
52 // {
53 inherit pname;
54 cargoExtraArgs = "-p ${pname}";
55 }
56 );
57 in {
58 inherit
59 craneLib
60 src
61 commonArgs
62 cargoArtifacts
63 individualCrateArgs
64 buildCrate
65 ;
66 };
67 years = builtins.attrNames (lib.filterAttrs (_: v: v == "directory") (builtins.readDir ./years));
68 allCrates =
69 (builtins.map (y: "y_${y}") years)
70 ++ [
71 "advent"
72 "advent_core"
73 "utils"
74 "macros"
75 ];
76 forAllCrates = lib.genAttrs' allCrates;
77 in
78 flakelight ./. {
79 lib = {
80 inherit years allCrates;
81 };
82 nixpkgs.overlays = [fenix.overlays.default];
83 flakelight.builtinFormatters = false;
84 formatters = pkgs: let
85 alejandra = "${pkgs.lib.getExe pkgs.alejandra} .";
86 rustfmt = "${(selectToolchain pkgs.fenix).rustfmt}/bin/rustfmt .";
87 taplo = "${pkgs.lib.getExe pkgs.taplo} fmt .";
88 in {
89 "*.nix" = alejandra;
90 "*.rs" = rustfmt;
91 "*.toml" = taplo;
92 };
93 packages =
94 forAllCrates (name: {
95 inherit name;
96 value = pkgs: (mkCrane pkgs).buildCrate name;
97 })
98 // {
99 default = pkgs: (mkCrane pkgs).buildCrate "advent";
100 };
101 checks = pkgs: let
102 inherit
103 (mkCrane pkgs)
104 src
105 commonArgs
106 craneLib
107 cargoArtifacts
108 ;
109 in
110 forAllCrates (name: {
111 name = "clippy-${name}";
112 value = craneLib.cargoClippy (
113 commonArgs
114 // {
115 inherit cargoArtifacts;
116 cargoClippyExtraArgs = "--all-targets -p ${name} -- --deny warnings";
117 }
118 );
119 })
120 // forAllCrates (name: {
121 name = "nextest-${name}";
122 value = craneLib.cargoNextest (
123 commonArgs
124 // {
125 inherit cargoArtifacts;
126 partitions = 1;
127 partitionType = "count";
128 cargoNextestPartitionsExtraArgs = "--no-tests=pass -p ${name}";
129 }
130 );
131 })
132 // {
133 advent-hakari = craneLib.mkCargoDerivation {
134 inherit src;
135 pname = "advent-hakari";
136 cargoArtifacts = null;
137 doInstallCargoArtifacts = false;
138
139 buildPhaseCargoCommand = ''
140 cargo hakari generate --diff # workspace-hack Cargo.toml is up-to-date
141 cargo hakari manage-deps --dry-run # all workspace crates depend on workspace-hack
142 cargo hakari verify
143 '';
144
145 nativeBuildInputs = [
146 pkgs.cargo-hakari
147 ];
148 };
149 };
150 devShell = pkgs:
151 (mkCrane pkgs).craneLib.devShell {
152 checks = self.checks.${pkgs.system};
153
154 packages = with pkgs; [cargo-hakari];
155 };
156 };
157}