summaryrefslogtreecommitdiff
path: root/flake.nix
blob: 43da5e6b6a75a4035fa1d9c7538558b4d6528ec1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    crane.url = "github:ipetkov/crane";
    crane.inputs.nixpkgs.follows = "nixpkgs";
    flake-utils.url = "github:numtide/flake-utils";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
      };
    };
  };

  outputs = { self, nixpkgs, crane, flake-utils, rust-overlay, ... }:
    let
      systems = with flake-utils.lib.system; [x86_64-linux x86_64-darwin aarch64-linux aarch64-darwin];
    in
    flake-utils.lib.eachSystem systems (system:
  let
    pkgs = import nixpkgs {
      inherit system;
      overlays = [ (import rust-overlay) ];
    };

    buildInputs = with pkgs; [
      trunk
      cargo-wasi
      openssl
      pkg-config
      wasm-bindgen-cli
    ];

    rustToolchain = pkgs.rust-bin.stable.latest.default.override {
      targets = [ "wasm32-unknown-unknown" "wasm32-wasi" ];
    };

    craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;

    commonArgs = {
      inherit buildInputs;
      src = craneLib.cleanCargoSource ./.;
    };

    commonArgsForWasm = commonArgs // {
      doCheck = false;
    };

    cargoArtifactsForServer = craneLib.buildDepsOnly (commonArgs // {
      cargoExtraArgs = "--workspace --exclude webapp";
    });

    cargoArtifactsForWasm = craneLib.buildDepsOnly (commonArgsForWasm // {
      cargoExtraArgs = "--workspace --exclude server --target wasm32-unknown-unknown";
    });

  in
  {
    # This requires a live db.
    # checks.sqlx-prepare = craneLib.mkCargoDerivation (commonArgs // {
    #   cargoArtifacts = cargoArtifactsForServer;
    #   buildInputs = commonArgs.buildInputs ++ [ pkgs.sqlx-cli ];
    #   buildPhaseCargoCommand = "cargo sqlx prepare --merged --check";
    # });

    checks.fmt = craneLib.cargoFmt {
      inherit (commonArgs) src;
    };
    packages.bridge-server = craneLib.buildPackage (commonArgs // {
      src = ./.;
    });

    packages.bridge-webapp = craneLib.buildPackage (commonArgsForWasm // {
      cargoArtifacts = cargoArtifactsForWasm;
      src = ./.;
      cargoExtraArgs = "--target wasm32-unknown-unknown";
      buildPhaseCargoCommand = ''
        pushd webapp
        echo Running trunk from directory $PWD
        trunk build --release
        popd
      '';
      installPhaseCommand = ''
        mkdir -p $out
        cp -r webapp/dist/* $out
      '';
    });

    devShells.default = pkgs.mkShell {
      inputsFrom = builtins.attrValues self.packages;
      nativeBuildInputs = with pkgs; [
        rustToolchain
        cargo-watch
        cargo-nextest
        clippy
        rustfmt
        sqlx-cli
        podman-compose
        postgresql
        rust-analyzer
        pkg-config
        openssl
      ];
    };
  });
}