A better Rust ATProto crate
1{inputs, ...}: {
2 imports = [
3 inputs.rust-flake.flakeModules.default
4 inputs.rust-flake.flakeModules.nixpkgs
5 # inputs.process-compose-flake.flakeModule
6 # inputs.cargo-doc-live.flakeModule
7 ];
8 perSystem = {
9 config,
10 self',
11 pkgs,
12 lib,
13 ...
14 }: let
15 inherit (pkgs.stdenv) isDarwin;
16 inherit (pkgs.darwin) apple_sdk;
17
18 # Common configuration for all crates
19 globalCrateConfig = {
20 crane.clippy.enable = false;
21 };
22
23 # Common build inputs for all crates
24 commonBuildInputs = with pkgs;
25 [
26 ]
27 ++ lib.optionals
28 isDarwin (
29 with apple_sdk.frameworks; [
30 IOKit
31 Security
32 SystemConfiguration
33 ]
34 );
35 in {
36 rust-project = {
37 # Source filtering to avoid unnecessary rebuilds
38 src = lib.cleanSourceWith {
39 src = inputs.self;
40 filter = config.rust-project.crane-lib.filterCargoSources;
41 };
42 crates = {
43 "jacquard" = {
44 imports = [globalCrateConfig];
45 autoWire = ["crate" "clippy"];
46 path = ./../../crates/jacquard;
47 crane = {
48 args = {
49 buildInputs = commonBuildInputs;
50 };
51 };
52 };
53
54 "jacquard-common" = {
55 imports = [globalCrateConfig];
56 autoWire = ["crate" "clippy"];
57 path = ./../../crates/jacquard-common;
58 crane = {
59 args = {
60 buildInputs = commonBuildInputs;
61 };
62 };
63 };
64 "jacquard-derive" = {
65 imports = [globalCrateConfig];
66 autoWire = ["crate" "clippy"];
67 path = ./../../crates/jacquard-derive;
68 crane = {
69 args = {
70 buildInputs = commonBuildInputs;
71 };
72 };
73 };
74 "jacquard-lexicon" = {
75 imports = [globalCrateConfig];
76 autoWire = ["crate" "clippy"];
77 path = ./../../crates/jacquard-lexicon;
78 crane = {
79 args = {
80 buildInputs = commonBuildInputs;
81 };
82 };
83 };
84 "jacquard-lexgen" = {
85 imports = [globalCrateConfig];
86 autoWire = ["crate" "clippy"];
87 path = ./../../crates/jacquard-lexgen;
88 crane = {
89 args = {
90 buildInputs = commonBuildInputs;
91 nativeBuildInputs = [pkgs.installShellFiles];
92 doCheck = false; # Tests require lexicon corpus files not available in nix build
93 postInstall = ''
94 # Install man pages and completions from build script output
95 for outdir in target/release/build/jacquard-lexgen-*/out; do
96 if [ -d "$outdir/man" ]; then
97 installManPage $outdir/man/*.1
98 fi
99 if [ -d "$outdir/completions" ]; then
100 # Install completions for both binaries
101 for completion in $outdir/completions/*; do
102 case "$(basename "$completion")" in
103 *.bash) installShellCompletion --bash "$completion" ;;
104 *.fish) installShellCompletion --fish "$completion" ;;
105 _*) installShellCompletion --zsh "$completion" ;;
106 esac
107 done
108 fi
109 done
110
111 # Install example lexicons.kdl config
112 install -Dm644 ${./../../crates/jacquard-lexgen/lexicons.kdl.example} $out/share/doc/jacquard-lexgen/lexicons.kdl.example
113 '';
114 };
115 };
116 };
117 "jacquard-api" = {
118 imports = [globalCrateConfig];
119 autoWire = ["crate" "clippy"];
120 path = ./../../crates/jacquard-api;
121 crane = {
122 args = {
123 buildInputs = commonBuildInputs;
124 };
125 };
126 };
127 "jacquard-identity" = {
128 imports = [globalCrateConfig];
129 autoWire = ["crate" "clippy"];
130 path = ./../../crates/jacquard-identity;
131 crane = {
132 args = {
133 buildInputs = commonBuildInputs;
134 };
135 };
136 };
137 "jacquard-oauth" = {
138 imports = [globalCrateConfig];
139 autoWire = ["crate" "clippy"];
140 path = ./../../crates/jacquard-oauth;
141 crane = {
142 args = {
143 buildInputs = commonBuildInputs;
144 };
145 };
146 };
147 "jacquard-axum" = {
148 imports = [globalCrateConfig];
149 autoWire = ["crate" "clippy"];
150 path = ./../../crates/jacquard-axum;
151 crane = {
152 args = {
153 buildInputs = commonBuildInputs;
154 };
155 };
156 };
157 "jacquard-repo" = {
158 imports = [globalCrateConfig];
159 autoWire = ["crate" "clippy"];
160 path = ./../../crates/jacquard-repo;
161 crane = {
162 args = {
163 buildInputs = commonBuildInputs;
164 };
165 };
166 };
167 };
168 };
169 packages.default = self'.packages.jacquard-lexgen;
170 };
171}