# heavily inspired by https://github.com/nulladmin1/nix-flake-templates/blob/main/rust-fenix-naersk/flake.nix
{
  description = "Rust Flake using Fenix and Naersk";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    systems.url = "github:nix-systems/default";
    naersk.url = "github:nix-community/naersk";
    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    { self
    , nixpkgs
    , naersk
    , fenix
    , systems
    , ...
    }:
    let
      forEachSystem = nixpkgs.lib.genAttrs (import systems);
      pkgsFor = forEachSystem (system:

        import nixpkgs {
          inherit system;
          overlays = [
            fenix.overlays.default
          ];
        });
      rust-toolchain = forEachSystem (system: pkgsFor.${system}.fenix.stable);
    in
    {
      formatter = forEachSystem (system: pkgsFor.${system}.nixpkgs-fmt);

      devShells = forEachSystem (system: {
        default = pkgsFor.${system}.mkShell {
          packages = with rust-toolchain.${system}; [
            cargo
            rustc
            clippy
            rustfmt
            rust-analyzer
          ];
          env = {
            RUST_BACKTRACE = "full";
          };
          RUST_SRC_PATH = "${rust-toolchain.${system}.rust-src}/lib/rustlib/src/rust/library";
        };
      });

      packages = forEachSystem (system: {
        default =
          (pkgsFor.${system}.callPackage naersk {
            inherit (rust-toolchain.${system}) cargo rustc;
          }).buildPackage {
            src = ./.;
          };
      });

      apps = forEachSystem (system: {
        default = {
          type = "app";
          program = "${self.packages.${system}.default}/bin/rust";
        };
      });
    };
}
