{
  description = "A Bevy engine flake for building and testing Rust projects with Bevy on Linux and MacOS.";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    crane.url = "github:ipetkov/crane";
    nix-github-actions = {
      url = "github:nix-community/nix-github-actions";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    crates-nix.url = "github:uttarayan21/crates.nix";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    advisory-db = {
      url = "github:rustsec/advisory-db";
      flake = false;
    };
  };

  outputs = {
    self,
    crane,
    flake-utils,
    nixpkgs,
    rust-overlay,
    advisory-db,
    nix-github-actions,
    crates-nix,
    ...
  }:
    flake-utils.lib.eachDefaultSystem (
      system: let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [
            rust-overlay.overlays.default
          ];
        };
        inherit (pkgs) lib;
        cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
        name = cargoToml.package.name;

        toolchain = pkgs.rust-bin.stable.latest.default;
        toolchainWithLLvmTools = toolchain.override {
          extensions = ["rust-src" "llvm-tools"];
        };
        toolchainWithRustAnalyzer = toolchain.override {
          extensions = ["rust-src" "rust-analyzer"];
        };
        crates = crates-nix.mkLib {inherit pkgs;};
        craneLib = (crane.mkLib pkgs).overrideToolchain toolchain;
        craneLibLLvmTools = (crane.mkLib pkgs).overrideToolchain toolchainWithLLvmTools;

        src = let
          filterBySuffix = path: exts: lib.any (ext: lib.hasSuffix ext path) exts;
          sourceFilters = path: type: (craneLib.filterCargoSources path type) || filterBySuffix path [".c" ".h" ".hpp" ".cpp" ".cc" "wgsl"];
        in
          lib.cleanSourceWith {
            filter = sourceFilters;
            src = ./.;
          };
        commonArgs = rec {
          inherit src;
          pname = name;
          stdenv = p: p.clangStdenv;
          doCheck = false;
          nativeBuildInputs = with pkgs; [
            pkg-config
          ];
          # LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [pkgs.wayland];
          LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
          # SYSTEM_DEPS_LINK = "static";
          # PKG_CONFIG_ALL_STATIC = "1";

          buildInputs = with pkgs;
            [
              gst_all_1.gst-libav
              gst_all_1.gst-plugins-base
              gst_all_1.gst-plugins-good
              gst_all_1.gst-plugins-bad
              gst_all_1.gst-plugins-ugly
              gst_all_1.gst-plugins-rs
              gst_all_1.gstreamer
              glib
              glib-networking

              # bzip2_1_1
              # libsysprof-capture
              # pcre2
              # libunwind
              # elfutils
              # zstd

              openssl
              vulkan-loader
            ]
            ++ (lib.optionals pkgs.stdenv.isLinux [
              gst_all_1.gstreamermm
              gst_all_1.gst-vaapi

              # util-linux
              # libselinux
              # libsepol

              alsa-lib-with-plugins
              libxkbcommon
              udev
              wayland
              wayland-protocols
              # xorg.libX11
              # xorg.libXi
              # xorg.libXrandr
            ])
            ++ (lib.optionals pkgs.stdenv.isDarwin [
              libiconv
              apple-sdk_26
            ]);
        };
        cargoArtifacts = craneLib.buildPackage commonArgs;
      in {
        checks =
          {
            "${name}-clippy" = craneLib.cargoClippy (commonArgs
              // {
                inherit cargoArtifacts;
                cargoClippyExtraArgs = "--all-targets -- --deny warnings";
              });
            "${name}-docs" = craneLib.cargoDoc (commonArgs // {inherit cargoArtifacts;});
            "${name}-fmt" = craneLib.cargoFmt {inherit src;};
            "${name}-toml-fmt" = craneLib.taploFmt {
              src = pkgs.lib.sources.sourceFilesBySuffices src [".toml"];
            };
            # Audit dependencies
            "${name}-audit" = craneLib.cargoAudit {
              inherit src advisory-db;
            };

            # Audit licenses
            "${name}-deny" = craneLib.cargoDeny {
              inherit src;
            };
            "${name}-nextest" = craneLib.cargoNextest (commonArgs
              // {
                inherit cargoArtifacts;
                partitions = 1;
                partitionType = "count";
              });
          }
          // lib.optionalAttrs (!pkgs.stdenv.isDarwin) {
            "${name}-llvm-cov" = craneLibLLvmTools.cargoLlvmCov (commonArgs // {inherit cargoArtifacts;});
          };

        packages = let
          pkg = craneLib.buildPackage (commonArgs
            // {inherit cargoArtifacts;}
            // {
              postInstall = ''
                mkdir -p $out/bin
                mkdir -p $out/share/bash-completions
                mkdir -p $out/share/fish/vendor_completions.d
                mkdir -p $out/share/zsh/site-functions
                $out/bin/${name} completions bash > $out/share/bash-completions/${name}.bash
                $out/bin/${name} completions fish > $out/share/fish/vendor_completions.d/${name}.fish
                $out/bin/${name} completions zsh > $out/share/zsh/site-functions/_${name}
              '';
            });
        in {
          "${name}" = pkg;
          default = pkg;
        };

        devShells = rec {
          rust-shell =
            pkgs.mkShell.override {
              stdenv =
                if pkgs.stdenv.isLinux
                then (pkgs.stdenvAdapters.useMoldLinker pkgs.clangStdenv)
                else pkgs.clangStdenv;
            } (commonArgs
              // {
                GST_PLUGIN_PATH = "/run/current-system/sw/lib/gstreamer-1.0/";
                GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules";
                packages = with pkgs;
                  [
                    toolchainWithRustAnalyzer
                    cargo-nextest
                    cargo-deny
                    cargo-expand
                    bacon
                    cargo-make
                    cargo-hack
                    cargo-outdated
                    lld
                    lldb
                    perf
                  ]
                  ++ (lib.optionals pkgs.stdenv.isDarwin [
                    apple-sdk_26
                  ])
                  ++ (lib.optionals pkgs.stdenv.isLinux [
                    mold
                  ]);
              });
          default = rust-shell;
        };
      }
    )
    // {
      githubActions = nix-github-actions.lib.mkGithubMatrix {
        checks = nixpkgs.lib.getAttrs ["x86_64-linux"] self.checks;
      };
    };
}
