4.9 kB
175 lines
1{
2 description = "future_form";
3
4 inputs = {
5 nixpkgs.url = "nixpkgs/nixos-25.11";
6 flake-utils.url = "github:numtide/flake-utils";
7 rust-overlay = {
8 url = "github:oxalica/rust-overlay";
9 inputs.nixpkgs.follows = "nixpkgs";
10 };
11 command-utils.url = "git+https://codeberg.org/expede/nix-command-utils";
12 };
13
14 outputs = {
15 self,
16 flake-utils,
17 nixpkgs,
18 rust-overlay,
19 command-utils,
20 } @ inputs:
21 flake-utils.lib.eachDefaultSystem (
22 system: let
23 overlays = [
24 (import rust-overlay)
25 ];
26
27 pkgs = import nixpkgs {
28 inherit system overlays;
29 config.allowUnfree = true;
30 };
31
32 rustVersion = "1.90.0";
33
34 rust-toolchain = (pkgs.rust-bin.stable.${rustVersion}.default.override {
35 extensions = [
36 "cargo"
37 "clippy"
38 "llvm-tools-preview"
39 "rust-src"
40 "rust-std"
41 "rustfmt"
42 ];
43
44 targets = [
45 "aarch64-apple-darwin"
46 "x86_64-apple-darwin"
47
48 "x86_64-unknown-linux-musl"
49 "aarch64-unknown-linux-musl"
50
51 "wasm32-unknown-unknown"
52 "thumbv6m-none-eabi"
53 ];
54 }).overrideAttrs (old: {
55 meta = (old.meta or {}) // { mainProgram = "cargo"; };
56 });
57
58 format-pkgs = with pkgs; [
59 nixpkgs-fmt
60 alejandra
61 taplo
62 ];
63
64 cargo-installs = with pkgs; [
65 cargo-component
66 cargo-deny
67 cargo-expand
68 cargo-hack
69 cargo-outdated
70 cargo-semver-checks
71 cargo-sort
72 cargo-udeps
73 typos
74 ];
75
76 # Command utils
77 rust = command-utils.rust.${system};
78 asModule = command-utils.asModule.${system};
79 cmd = command-utils.cmd.${system};
80 cargo = "${rust-toolchain}/bin/cargo";
81
82 menu = command-utils.commands.${system} [
83 (rust.test { cargo = rust-toolchain; cargo-watch = pkgs.cargo-watch; })
84 (rust.lint { cargo = rust-toolchain; })
85 (rust.fmt { cargo = rust-toolchain; })
86 (rust.build { cargo = rust-toolchain; })
87 (rust.doc { cargo = rust-toolchain; })
88 (rust.watch { cargo-watch = pkgs.cargo-watch; })
89 (rust.audit { cargo-audit = pkgs.cargo-audit; })
90 (rust.semver { cargo-semver-checks = pkgs.cargo-semver-checks; })
91 (rust.ci { cargo = rust-toolchain; })
92 (asModule {
93 "ffi:test" = cmd "Run FFI e2e tests (Go, Java, Python)"
94 "${cargo} test --workspace --test ffi_e2e -- --include-ignored --nocapture";
95 "ffi:test:example" = cmd "Run example crate unit tests"
96 "${cargo} test --manifest-path future_form_ffi/examples/counter_effects/counter_effects/Cargo.toml && ${cargo} test --manifest-path future_form_ffi/examples/key_value_store/kv_store/Cargo.toml";
97 })
98 ];
99
100 ci-rust-toolchain = (pkgs.rust-bin.stable.${rustVersion}.default.override {
101 extensions = [
102 "cargo"
103 "clippy"
104 "rustfmt"
105 ];
106
107 targets = [
108 "wasm32-unknown-unknown"
109 ];
110 }).overrideAttrs (old: {
111 meta = (old.meta or {}) // { mainProgram = "cargo"; };
112 });
113
114 # Stub so tools that probe for rustup (e.g. cargo-semver-checks)
115 # silently succeed instead of failing with "No such file or directory".
116 rustup-shim = pkgs.writeShellScriptBin "rustup" ''
117 if [ "$1" = "--version" ]; then
118 echo "rustup-nix-shim"
119 elif [ "$1" = "toolchain" ]; then
120 exit 0
121 elif [ "$1" = "which" ]; then
122 command -v "$2" 2>/dev/null || echo "$2"
123 else
124 exit 0
125 fi
126 '';
127
128 ci-cargo-installs = with pkgs; [
129 cargo-deny
130 cargo-hack
131 cargo-semver-checks
132 typos
133 ];
134
135 in rec {
136 devShells.default = pkgs.mkShell {
137 name = "future_form shell";
138
139 nativeBuildInputs = with pkgs;
140 [
141 rust-toolchain
142 rust-analyzer
143 ]
144 ++ menu
145 ++ format-pkgs
146 ++ cargo-installs;
147
148 shellHook = ''
149 unset SOURCE_DATE_EPOCH
150 export WORKSPACE_ROOT="$(pwd)"
151 menu
152 '';
153 };
154
155 devShells.ci = pkgs.mkShell {
156 name = "future_form ci";
157
158 nativeBuildInputs =
159 [
160 ci-rust-toolchain
161 rustup-shim
162 ]
163 ++ ci-cargo-installs;
164 };
165
166 devShells.ffi = pkgs.mkShell {
167 name = "future_form ffi shell";
168 inputsFrom = [devShells.ci];
169 nativeBuildInputs = [pkgs.go pkgs.jdk pkgs.python3];
170 };
171
172 formatter = pkgs.alejandra;
173 }
174 );
175}