flake.nix 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. {
  2. description = "CDK Flake";
  3. inputs = {
  4. nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
  5. rust-overlay = {
  6. url = "github:oxalica/rust-overlay";
  7. inputs = {
  8. nixpkgs.follows = "nixpkgs";
  9. };
  10. };
  11. fenix = {
  12. url = "github:nix-community/fenix";
  13. inputs.nixpkgs.follows = "nixpkgs";
  14. inputs.rust-analyzer-src.follows = "";
  15. };
  16. flake-utils.url = "github:numtide/flake-utils";
  17. crane = {
  18. url = "github:ipetkov/crane";
  19. };
  20. };
  21. outputs =
  22. { self
  23. , nixpkgs
  24. , rust-overlay
  25. , flake-utils
  26. , crane
  27. , ...
  28. }@inputs:
  29. flake-utils.lib.eachDefaultSystem (
  30. system:
  31. let
  32. overlays = [ (import rust-overlay) ];
  33. lib = pkgs.lib;
  34. stdenv = pkgs.stdenv;
  35. isDarwin = stdenv.isDarwin;
  36. libsDarwin =
  37. with pkgs;
  38. lib.optionals isDarwin [
  39. # Additional darwin specific inputs can be set here
  40. # Note: Security and SystemConfiguration frameworks are provided by the default SDK
  41. ];
  42. # Dependencies
  43. pkgs = import nixpkgs {
  44. inherit system overlays;
  45. };
  46. # Toolchains
  47. # latest stable
  48. stable_toolchain = pkgs.rust-bin.stable."1.92.0".default.override {
  49. targets = [ "wasm32-unknown-unknown" ]; # wasm
  50. extensions = [
  51. "rustfmt"
  52. "clippy"
  53. "rust-analyzer"
  54. ];
  55. };
  56. # MSRV stable
  57. msrv_toolchain = pkgs.rust-bin.stable."1.85.0".default.override {
  58. targets = [ "wasm32-unknown-unknown" ]; # wasm
  59. extensions = [
  60. "rustfmt"
  61. "clippy"
  62. "rust-analyzer"
  63. ];
  64. };
  65. # Nightly used for formatting
  66. nightly_toolchain = pkgs.rust-bin.selectLatestNightlyWith (
  67. toolchain:
  68. toolchain.default.override {
  69. extensions = [
  70. "rustfmt"
  71. "clippy"
  72. "rust-analyzer"
  73. "rust-src"
  74. ];
  75. targets = [ "wasm32-unknown-unknown" ]; # wasm
  76. }
  77. );
  78. # ========================================
  79. # Crane setup for cached builds
  80. # ========================================
  81. craneLib = (crane.mkLib pkgs).overrideToolchain stable_toolchain;
  82. craneLibMsrv = (crane.mkLib pkgs).overrideToolchain msrv_toolchain;
  83. # Source for crane builds (uses nix-gitignore to filter out target/, etc.)
  84. src = pkgs.nix-gitignore.gitignoreSource [ ] ./.;
  85. # Source for MSRV builds - uses Cargo.lock.msrv with MSRV-compatible deps
  86. srcMsrv = pkgs.runCommand "cdk-source-msrv" { } ''
  87. cp -r ${src} $out
  88. chmod -R +w $out
  89. cp $out/Cargo.lock.msrv $out/Cargo.lock
  90. '';
  91. # Common args for all Crane builds
  92. commonCraneArgs = {
  93. inherit src;
  94. pname = "cdk";
  95. version = "0.14.0";
  96. nativeBuildInputs = with pkgs; [
  97. pkg-config
  98. protobuf
  99. ];
  100. buildInputs = with pkgs; [
  101. openssl
  102. sqlite
  103. zlib
  104. ] ++ libsDarwin;
  105. # Environment variables
  106. PROTOC = "${pkgs.protobuf}/bin/protoc";
  107. PROTOC_INCLUDE = "${pkgs.protobuf}/include";
  108. };
  109. # Common args for MSRV builds - uses srcMsrv with pinned deps
  110. commonCraneArgsMsrv = commonCraneArgs // {
  111. src = srcMsrv;
  112. };
  113. # Build ALL dependencies once - this is what gets cached by Cachix
  114. # Note: We exclude swagger feature as it tries to download assets during build
  115. workspaceDeps = craneLib.buildDepsOnly (commonCraneArgs // {
  116. pname = "cdk-deps";
  117. # Build deps for workspace - swagger excluded (downloads during build)
  118. cargoExtraArgs = "--workspace";
  119. });
  120. # MSRV dependencies (separate cache due to different toolchain)
  121. workspaceDepsMsrv = craneLibMsrv.buildDepsOnly (commonCraneArgsMsrv // {
  122. pname = "cdk-deps-msrv";
  123. cargoExtraArgs = "--workspace";
  124. });
  125. # Helper function to create clippy checks
  126. mkClippy = name: cargoArgs: craneLib.cargoClippy (commonCraneArgs // {
  127. pname = "cdk-clippy-${name}";
  128. cargoArtifacts = workspaceDeps;
  129. cargoClippyExtraArgs = "${cargoArgs} -- -D warnings";
  130. });
  131. # Helper function to create example checks (compile only, no network access in sandbox)
  132. mkExample = name: craneLib.mkCargoDerivation (commonCraneArgs // {
  133. pname = "cdk-example-${name}";
  134. cargoArtifacts = workspaceDeps;
  135. buildPhaseCargoCommand = "cargo build --example ${name}";
  136. # Examples are compiled but not run (no network in Nix sandbox)
  137. installPhaseCommand = "mkdir -p $out";
  138. });
  139. # Helper function to create example packages (outputs binary for running outside sandbox)
  140. mkExamplePackage = name: craneLib.mkCargoDerivation (commonCraneArgs // {
  141. pname = "cdk-example-${name}";
  142. cargoArtifacts = workspaceDeps;
  143. buildPhaseCargoCommand = "cargo build --release --example ${name}";
  144. installPhaseCommand = ''
  145. mkdir -p $out/bin
  146. cp target/release/examples/${name} $out/bin/
  147. '';
  148. });
  149. # Helper function to create MSRV build checks
  150. mkMsrvBuild = name: cargoArgs: craneLibMsrv.cargoBuild (commonCraneArgsMsrv // {
  151. pname = "cdk-msrv-${name}";
  152. cargoArtifacts = workspaceDepsMsrv;
  153. cargoExtraArgs = cargoArgs;
  154. });
  155. # Helper function to create WASM build checks
  156. # WASM builds don't need native libs like openssl
  157. mkWasmBuild = name: cargoArgs: craneLib.cargoBuild ({
  158. inherit src;
  159. pname = "cdk-wasm-${name}";
  160. version = "0.14.0";
  161. cargoArtifacts = workspaceDeps;
  162. cargoExtraArgs = "${cargoArgs} --target wasm32-unknown-unknown";
  163. # WASM doesn't need native build inputs
  164. nativeBuildInputs = with pkgs; [ pkg-config ];
  165. buildInputs = [ ];
  166. # Disable tests for WASM (can't run in sandbox)
  167. doCheck = false;
  168. });
  169. # Doc tests check
  170. docTests = craneLib.cargoTest (commonCraneArgs // {
  171. pname = "cdk-doc-tests";
  172. cargoArtifacts = workspaceDeps;
  173. cargoTestExtraArgs = "--doc";
  174. });
  175. # Strict docs check - build docs with warnings as errors
  176. # Uses mkCargoDerivation for custom RUSTDOCFLAGS
  177. strictDocs = craneLib.mkCargoDerivation (commonCraneArgs // {
  178. pname = "cdk-strict-docs";
  179. cargoArtifacts = workspaceDeps;
  180. buildPhaseCargoCommand = ''
  181. export RUSTDOCFLAGS="-D warnings"
  182. cargo doc --no-deps \
  183. -p cashu \
  184. -p cdk-common \
  185. -p cdk-sql-common \
  186. -p cdk \
  187. -p cdk-redb \
  188. -p cdk-sqlite \
  189. -p cdk-axum \
  190. -p cdk-cln \
  191. -p cdk-lnd \
  192. -p cdk-lnbits \
  193. -p cdk-fake-wallet \
  194. -p cdk-mint-rpc \
  195. -p cdk-payment-processor \
  196. -p cdk-signatory \
  197. -p cdk-cli \
  198. -p cdk-mintd
  199. '';
  200. installPhaseCommand = "mkdir -p $out";
  201. });
  202. # FFI Python tests
  203. ffiTests = craneLib.mkCargoDerivation (commonCraneArgs // {
  204. pname = "cdk-ffi-tests";
  205. cargoArtifacts = workspaceDeps;
  206. nativeBuildInputs = commonCraneArgs.nativeBuildInputs ++ [
  207. pkgs.python311
  208. ];
  209. buildPhaseCargoCommand = ''
  210. # Build the FFI library
  211. cargo build --release --package cdk-ffi --features postgres
  212. # Generate Python bindings
  213. cargo run --bin uniffi-bindgen generate \
  214. --library target/release/libcdk_ffi.so \
  215. --language python \
  216. --out-dir target/bindings/python
  217. # Copy library to bindings directory
  218. cp target/release/libcdk_ffi.so target/bindings/python/
  219. # Run Python tests
  220. python3 crates/cdk-ffi/tests/test_transactions.py
  221. '';
  222. installPhaseCommand = "mkdir -p $out";
  223. });
  224. # ========================================
  225. # Example definitions - single source of truth
  226. # ========================================
  227. exampleChecks = [
  228. "mint-token"
  229. "melt-token"
  230. "p2pk"
  231. "proof-selection"
  232. "wallet"
  233. ];
  234. # ========================================
  235. # Clippy check definitions - single source of truth
  236. # ========================================
  237. clippyChecks = {
  238. # Core crate: cashu
  239. "cashu" = "-p cashu";
  240. "cashu-no-default" = "-p cashu --no-default-features";
  241. "cashu-wallet" = "-p cashu --no-default-features --features wallet";
  242. "cashu-mint" = "-p cashu --no-default-features --features mint";
  243. "cashu-auth" = "-p cashu --no-default-features --features auth";
  244. # Core crate: cdk-common
  245. "cdk-common" = "-p cdk-common";
  246. "cdk-common-no-default" = "-p cdk-common --no-default-features";
  247. "cdk-common-wallet" = "-p cdk-common --no-default-features --features wallet";
  248. "cdk-common-mint" = "-p cdk-common --no-default-features --features mint";
  249. "cdk-common-auth" = "-p cdk-common --no-default-features --features auth";
  250. # Core crate: cdk
  251. "cdk" = "-p cdk";
  252. "cdk-no-default" = "-p cdk --no-default-features";
  253. "cdk-wallet" = "-p cdk --no-default-features --features wallet";
  254. "cdk-mint" = "-p cdk --no-default-features --features mint";
  255. "cdk-auth" = "-p cdk --no-default-features --features auth";
  256. # SQL crates
  257. "cdk-sql-common" = "-p cdk-sql-common";
  258. "cdk-sql-common-wallet" = "-p cdk-sql-common --no-default-features --features wallet";
  259. "cdk-sql-common-mint" = "-p cdk-sql-common --no-default-features --features mint";
  260. # Database crates
  261. "cdk-redb" = "-p cdk-redb";
  262. "cdk-sqlite" = "-p cdk-sqlite";
  263. "cdk-sqlite-sqlcipher" = "-p cdk-sqlite --features sqlcipher";
  264. # HTTP/API layer
  265. # Note: swagger feature excluded - downloads assets during build, incompatible with Nix sandbox
  266. "cdk-axum" = "-p cdk-axum";
  267. "cdk-axum-no-default" = "-p cdk-axum --no-default-features";
  268. "cdk-axum-redis" = "-p cdk-axum --no-default-features --features redis";
  269. # Lightning backends
  270. "cdk-cln" = "-p cdk-cln";
  271. "cdk-lnd" = "-p cdk-lnd";
  272. "cdk-lnbits" = "-p cdk-lnbits";
  273. "cdk-fake-wallet" = "-p cdk-fake-wallet";
  274. "cdk-payment-processor" = "-p cdk-payment-processor";
  275. "cdk-ldk-node" = "-p cdk-ldk-node";
  276. # Other crates
  277. "cdk-signatory" = "-p cdk-signatory";
  278. "cdk-mint-rpc" = "-p cdk-mint-rpc";
  279. "cdk-prometheus" = "-p cdk-prometheus";
  280. "cdk-ffi" = "-p cdk-ffi";
  281. # Binaries: cdk-cli
  282. "bin-cdk-cli" = "--bin cdk-cli";
  283. "bin-cdk-cli-sqlcipher" = "--bin cdk-cli --features sqlcipher";
  284. "bin-cdk-cli-redb" = "--bin cdk-cli --features redb";
  285. # Binaries: cdk-mintd
  286. "bin-cdk-mintd" = "--bin cdk-mintd";
  287. "bin-cdk-mintd-redis" = "--bin cdk-mintd --features redis";
  288. "bin-cdk-mintd-sqlcipher" = "--bin cdk-mintd --features sqlcipher";
  289. "bin-cdk-mintd-lnd-sqlite" = "--bin cdk-mintd --no-default-features --features lnd,sqlite";
  290. "bin-cdk-mintd-cln-postgres" = "--bin cdk-mintd --no-default-features --features cln,postgres";
  291. "bin-cdk-mintd-lnbits-sqlite" = "--bin cdk-mintd --no-default-features --features lnbits,sqlite";
  292. "bin-cdk-mintd-fakewallet-sqlite" = "--bin cdk-mintd --no-default-features --features fakewallet,sqlite";
  293. "bin-cdk-mintd-grpc-processor-sqlite" = "--bin cdk-mintd --no-default-features --features grpc-processor,sqlite";
  294. "bin-cdk-mintd-management-rpc-lnd-sqlite" = "--bin cdk-mintd --no-default-features --features management-rpc,lnd,sqlite";
  295. "bin-cdk-mintd-cln-sqlite" = "--bin cdk-mintd --no-default-features --features cln,sqlite";
  296. "bin-cdk-mintd-lnd-postgres" = "--bin cdk-mintd --no-default-features --features lnd,postgres";
  297. "bin-cdk-mintd-lnbits-postgres" = "--bin cdk-mintd --no-default-features --features lnbits,postgres";
  298. "bin-cdk-mintd-fakewallet-postgres" = "--bin cdk-mintd --no-default-features --features fakewallet,postgres";
  299. "bin-cdk-mintd-grpc-processor-postgres" = "--bin cdk-mintd --no-default-features --features grpc-processor,postgres";
  300. "bin-cdk-mintd-management-rpc-cln-postgres" = "--bin cdk-mintd --no-default-features --features management-rpc,cln,postgres";
  301. "bin-cdk-mintd-auth-sqlite-fakewallet" = "--bin cdk-mintd --no-default-features --features auth,sqlite,fakewallet";
  302. "bin-cdk-mintd-auth-postgres-lnd" = "--bin cdk-mintd --no-default-features --features auth,postgres,lnd";
  303. # Binaries: cdk-mint-cli
  304. "bin-cdk-mint-cli" = "--bin cdk-mint-cli";
  305. };
  306. # ========================================
  307. # MSRV build check definitions
  308. # ========================================
  309. msrvChecks = {
  310. # Core library with all features (except swagger which breaks MSRV)
  311. "cdk-all-features" = "-p cdk --features \"mint,wallet,auth\"";
  312. # Mintd with all backends, databases, and features (no swagger)
  313. "cdk-mintd-all" = "-p cdk-mintd --no-default-features --features \"cln,lnd,lnbits,fakewallet,ldk-node,grpc-processor,sqlite,postgres,auth,redis,management-rpc\"";
  314. # CLI - default features (excludes redb which breaks MSRV)
  315. "cdk-cli" = "-p cdk-cli";
  316. # Minimal builds to ensure no-default-features works
  317. "cdk-wallet-only" = "-p cdk --no-default-features --features wallet";
  318. };
  319. # ========================================
  320. # WASM build check definitions
  321. # ========================================
  322. wasmChecks = {
  323. "cdk" = "-p cdk";
  324. "cdk-no-default" = "-p cdk --no-default-features";
  325. "cdk-wallet" = "-p cdk --no-default-features --features wallet";
  326. };
  327. # Common inputs
  328. envVars = {
  329. # rust analyzer needs NIX_PATH for some reason.
  330. NIX_PATH = "nixpkgs=${inputs.nixpkgs}";
  331. };
  332. # Override clightning to include mako dependency and fix compilation bug
  333. clightningWithMako = pkgs.clightning.overrideAttrs (oldAttrs: {
  334. nativeBuildInputs = (oldAttrs.nativeBuildInputs or [ ]) ++ [
  335. pkgs.python311Packages.mako
  336. ];
  337. # Disable -Werror to work around multiple compilation bugs in 25.09.2 on macOS
  338. # See: https://github.com/ElementsProject/lightning/issues/7961
  339. env = (oldAttrs.env or { }) // {
  340. NIX_CFLAGS_COMPILE = toString ((oldAttrs.env.NIX_CFLAGS_COMPILE or "") + " -Wno-error");
  341. };
  342. });
  343. buildInputs =
  344. with pkgs;
  345. [
  346. # Add additional build inputs here
  347. git
  348. pkg-config
  349. curl
  350. just
  351. protobuf
  352. nixpkgs-fmt
  353. typos
  354. lnd
  355. clightningWithMako
  356. bitcoind
  357. sqlx-cli
  358. mprocs
  359. cargo-outdated
  360. cargo-mutants
  361. # Needed for github ci
  362. libz
  363. ]
  364. ++ libsDarwin;
  365. # PostgreSQL configuration
  366. postgresConf = {
  367. pgUser = "cdk_user";
  368. pgPassword = "cdk_password";
  369. pgDatabase = "cdk_mint";
  370. pgPort = "5432";
  371. };
  372. # Script to start PostgreSQL
  373. startPostgres = pkgs.writeShellScriptBin "start-postgres" ''
  374. set -e
  375. PGDATA="$PWD/.pg_data"
  376. PGPORT="${postgresConf.pgPort}"
  377. PGUSER="${postgresConf.pgUser}"
  378. PGPASSWORD="${postgresConf.pgPassword}"
  379. PGDATABASE="${postgresConf.pgDatabase}"
  380. # Stop any existing instance first
  381. if [ -d "$PGDATA" ] && ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" status > /dev/null 2>&1; then
  382. echo "Stopping existing PostgreSQL instance..."
  383. ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" stop > /dev/null 2>&1
  384. fi
  385. if [ ! -d "$PGDATA" ]; then
  386. echo "Initializing PostgreSQL database..."
  387. ${pkgs.postgresql_16}/bin/initdb -D "$PGDATA" --auth=trust --no-locale --encoding=UTF8
  388. # Configure PostgreSQL
  389. echo "listen_addresses = 'localhost'" >> "$PGDATA/postgresql.conf"
  390. echo "port = $PGPORT" >> "$PGDATA/postgresql.conf"
  391. echo "unix_socket_directories = '$PGDATA'" >> "$PGDATA/postgresql.conf"
  392. # Start temporarily to create user and database
  393. ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" -l "$PGDATA/logfile" start
  394. sleep 2
  395. # Create user and database
  396. ${pkgs.postgresql_16}/bin/createuser -h localhost -p $PGPORT -s "$PGUSER" || true
  397. ${pkgs.postgresql_16}/bin/psql -h localhost -p $PGPORT -c "ALTER USER $PGUSER WITH PASSWORD '$PGPASSWORD';" postgres
  398. ${pkgs.postgresql_16}/bin/createdb -h localhost -p $PGPORT -O "$PGUSER" "$PGDATABASE" || true
  399. ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" stop
  400. echo "PostgreSQL initialized."
  401. fi
  402. echo "Starting PostgreSQL on port $PGPORT..."
  403. ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" -l "$PGDATA/logfile" start
  404. echo "PostgreSQL started. Connection URL: postgresql://$PGUSER:$PGPASSWORD@localhost:$PGPORT/$PGDATABASE"
  405. '';
  406. # Script to stop PostgreSQL
  407. stopPostgres = pkgs.writeShellScriptBin "stop-postgres" ''
  408. PGDATA="$PWD/.pg_data"
  409. if [ -d "$PGDATA" ]; then
  410. echo "Stopping PostgreSQL..."
  411. ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" stop || echo "PostgreSQL was not running."
  412. else
  413. echo "No PostgreSQL data directory found."
  414. fi
  415. '';
  416. # Script to check PostgreSQL status
  417. pgStatus = pkgs.writeShellScriptBin "pg-status" ''
  418. PGDATA="$PWD/.pg_data"
  419. if [ -d "$PGDATA" ]; then
  420. ${pkgs.postgresql_16}/bin/pg_ctl -D "$PGDATA" status
  421. else
  422. echo "No PostgreSQL data directory found. Run 'start-postgres' first."
  423. fi
  424. '';
  425. # Script to connect to PostgreSQL
  426. pgConnect = pkgs.writeShellScriptBin "pg-connect" ''
  427. ${pkgs.postgresql_16}/bin/psql "postgresql://${postgresConf.pgUser}:${postgresConf.pgPassword}@localhost:${postgresConf.pgPort}/${postgresConf.pgDatabase}"
  428. '';
  429. # Common arguments can be set here to avoid repeating them later
  430. nativeBuildInputs = [
  431. #Add additional build inputs here
  432. ]
  433. ++ lib.optionals isDarwin [
  434. # Additional darwin specific native inputs can be set here
  435. ];
  436. in
  437. {
  438. # Expose deps for explicit cache warming
  439. packages = {
  440. deps = workspaceDeps;
  441. deps-msrv = workspaceDepsMsrv;
  442. }
  443. # Example packages (binaries that can be run outside sandbox with network access)
  444. // (builtins.listToAttrs (map (name: { name = "example-${name}"; value = mkExamplePackage name; }) exampleChecks));
  445. checks =
  446. # Generate clippy checks from clippyChecks attrset
  447. (builtins.mapAttrs (name: args: mkClippy name args) clippyChecks)
  448. # Generate MSRV build checks (prefixed with msrv-)
  449. // (builtins.listToAttrs (map (name: { name = "msrv-${name}"; value = mkMsrvBuild name msrvChecks.${name}; }) (builtins.attrNames msrvChecks)))
  450. # Generate WASM build checks (prefixed with wasm-)
  451. // (builtins.listToAttrs (map (name: { name = "wasm-${name}"; value = mkWasmBuild name wasmChecks.${name}; }) (builtins.attrNames wasmChecks)))
  452. # Generate example checks from exampleChecks list
  453. // (builtins.listToAttrs (map (name: { name = "example-${name}"; value = mkExample name; }) exampleChecks))
  454. // {
  455. # Doc tests
  456. doc-tests = docTests;
  457. # Strict docs check
  458. strict-docs = strictDocs;
  459. # FFI Python tests
  460. ffi-tests = ffiTests;
  461. };
  462. devShells =
  463. let
  464. # devShells
  465. msrv = pkgs.mkShell (
  466. {
  467. shellHook = "
  468. cargo update
  469. cargo update home --precise 0.5.11
  470. cargo update typed-index-collections --precise 3.3.0
  471. ";
  472. buildInputs = buildInputs ++ [ msrv_toolchain ];
  473. inherit nativeBuildInputs;
  474. }
  475. // envVars
  476. );
  477. stable = pkgs.mkShell (
  478. {
  479. shellHook = ''
  480. # Needed for github ci
  481. export LD_LIBRARY_PATH=${
  482. pkgs.lib.makeLibraryPath [
  483. pkgs.zlib
  484. ]
  485. }:$LD_LIBRARY_PATH
  486. # PostgreSQL environment variables
  487. export CDK_MINTD_DATABASE_URL="postgresql://${postgresConf.pgUser}:${postgresConf.pgPassword}@localhost:${postgresConf.pgPort}/${postgresConf.pgDatabase}"
  488. echo ""
  489. echo "PostgreSQL commands available:"
  490. echo " start-postgres - Initialize and start PostgreSQL"
  491. echo " stop-postgres - Stop PostgreSQL (run before exiting)"
  492. echo " pg-status - Check PostgreSQL status"
  493. echo " pg-connect - Connect to PostgreSQL with psql"
  494. echo ""
  495. '';
  496. buildInputs = buildInputs ++ [
  497. stable_toolchain
  498. pkgs.postgresql_16
  499. startPostgres
  500. stopPostgres
  501. pgStatus
  502. pgConnect
  503. ];
  504. inherit nativeBuildInputs;
  505. }
  506. // envVars
  507. );
  508. nightly = pkgs.mkShell (
  509. {
  510. shellHook = ''
  511. # Needed for github ci
  512. export LD_LIBRARY_PATH=${
  513. pkgs.lib.makeLibraryPath [
  514. pkgs.zlib
  515. ]
  516. }:$LD_LIBRARY_PATH
  517. # PostgreSQL environment variables
  518. export CDK_MINTD_DATABASE_URL="postgresql://${postgresConf.pgUser}:${postgresConf.pgPassword}@localhost:${postgresConf.pgPort}/${postgresConf.pgDatabase}"
  519. echo ""
  520. echo "PostgreSQL commands available:"
  521. echo " start-postgres - Initialize and start PostgreSQL"
  522. echo " stop-postgres - Stop PostgreSQL (run before exiting)"
  523. echo " pg-status - Check PostgreSQL status"
  524. echo " pg-connect - Connect to PostgreSQL with psql"
  525. echo ""
  526. '';
  527. buildInputs = buildInputs ++ [
  528. nightly_toolchain
  529. pkgs.postgresql_16
  530. startPostgres
  531. stopPostgres
  532. pgStatus
  533. pgConnect
  534. ];
  535. inherit nativeBuildInputs;
  536. }
  537. // envVars
  538. );
  539. # Shell with Docker for integration tests
  540. integration = pkgs.mkShell (
  541. {
  542. shellHook = ''
  543. # Ensure Docker is available
  544. if ! command -v docker &> /dev/null; then
  545. echo "Docker is not installed or not in PATH"
  546. echo "Please install Docker to run integration tests"
  547. exit 1
  548. fi
  549. echo "Docker is available at $(which docker)"
  550. echo "Docker version: $(docker --version)"
  551. '';
  552. buildInputs = buildInputs ++ [
  553. stable_toolchain
  554. pkgs.docker-client
  555. pkgs.python311
  556. ];
  557. inherit nativeBuildInputs;
  558. }
  559. // envVars
  560. );
  561. # Shell for FFI development (Python bindings)
  562. ffi = pkgs.mkShell (
  563. {
  564. shellHook = ''
  565. echo "FFI development shell"
  566. echo " just ffi-test - Run Python FFI tests"
  567. echo " just ffi-dev-python - Launch Python REPL with CDK FFI"
  568. '';
  569. buildInputs = buildInputs ++ [
  570. stable_toolchain
  571. pkgs.python311
  572. ];
  573. inherit nativeBuildInputs;
  574. }
  575. // envVars
  576. );
  577. in
  578. {
  579. inherit
  580. msrv
  581. stable
  582. nightly
  583. integration
  584. ffi
  585. ;
  586. default = stable;
  587. };
  588. }
  589. );
  590. }