# Nix flake for reproducible builds & development environments.
# TL;DR:
# either `curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install`
# or https://github.com/DeterminateSystems/nix-installer
# and then `nix build` or `nix develop`
{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    flake-parts.url = "github:hercules-ci/flake-parts";
    #systems.url = "github:nix-systems/default";

    # Dev tools
    treefmt-nix.url = "github:numtide/treefmt-nix";
  };

  outputs = inputs:
    inputs.flake-parts.lib.mkFlake {inherit inputs;} {
      systems = ["x86_64-linux" "aarch64-linux"];
      imports = [
        inputs.treefmt-nix.flakeModule
      ];
      perSystem = {
        config,
        self',
        pkgs,
        lib,
        system,
        ...
      }: let
        cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
        nonRustDeps = [
          pkgs.libiconv
          pkgs.pkg-config
          pkgs.protobuf
	  pkgs.grpcurl
        ];
        rust-toolchain = pkgs.symlinkJoin {
          name = "rust-toolchain";
          paths = [pkgs.rustc pkgs.cargo pkgs.cargo-watch pkgs.rust-analyzer pkgs.rustPlatform.rustcSrc];
        };
      in {
        # Rust package
        packages.default = pkgs.rustPlatform.buildRustPackage {
          inherit (cargoToml.package) name version;
          nativeBuildInputs = nonRustDeps;
          buildInputs = nonRustDeps;
          src = ./.;
          cargoLock.lockFile = ./Cargo.lock;
        };

        # Rust dev environment
        devShells.default = pkgs.mkShell {
          inputsFrom = [
            config.treefmt.build.devShell
          ];
          shellHook = ''
                   # For rust-analyzer 'hover' tooltips to work.
                   export RUST_SRC_PATH=${pkgs.rustPlatform.rustLibSrc}
            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${pkgs.vulkan-loader}/lib/:${pkgs.wayland}/lib/:${pkgs.libxkbcommon}/lib/
                   echo $RUST_SRC_PATH

                   echo
                   echo "Run 'just <recipe>' to get started"
                   just
          '';
          buildInputs = nonRustDeps;
          nativeBuildInputs = with pkgs; [
            just
            rust-toolchain
          ];
          RUST_BACKTRACE = 1;
        };

        # Add your auto-formatters here.
        # cf. https://numtide.github.io/treefmt/
        treefmt.config = {
          projectRootFile = "flake.nix";
          programs = {
            nixpkgs-fmt.enable = true;
            rustfmt.enable = true;
          };
        };
      };
    };
}