Advent of Code solutions
at main 157 lines 4.3 kB view raw
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}