drawbridge 0.1.0

Drawbridge library.
Documentation
{
  description = "Profian Drawbridge";

  inputs.cargo2nix.inputs.flake-compat.follows = "flake-compat";
  inputs.cargo2nix.inputs.flake-utils.follows = "flake-utils";
  inputs.cargo2nix.inputs.nixpkgs.follows = "nixpkgs";
  inputs.cargo2nix.inputs.rust-overlay.follows = "rust-overlay";
  inputs.cargo2nix.url = github:cargo2nix/cargo2nix;
  inputs.flake-compat.flake = false;
  inputs.flake-compat.url = github:edolstra/flake-compat;
  inputs.flake-utils.url = github:numtide/flake-utils;
  inputs.nixpkgs.url = github:profianinc/nixpkgs;
  inputs.rust-overlay.inputs.flake-utils.follows = "flake-utils";
  inputs.rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
  inputs.rust-overlay.url = github:oxalica/rust-overlay;

  outputs = {
    self,
    cargo2nix,
    flake-utils,
    nixpkgs,
    ...
  }:
    flake-utils.lib.eachDefaultSystem (
      system: let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [cargo2nix.overlays.default];
        };
        pkgsX86_64LinuxMusl = import nixpkgs {
          inherit system;
          crossSystem = {
            config = "x86_64-unknown-linux-musl";
          };
          overlays = [cargo2nix.overlays.default];
        };

        cargo2nixBin = cargo2nix.packages.${system}.cargo2nix;
        devRust = pkgs.rust-bin.fromRustupToolchainFile "${self}/rust-toolchain.toml";

        cargo.toml = builtins.fromTOML (builtins.readFile "${self}/Cargo.toml");

        mkBin = args: pkgs:
          ((pkgs.rustBuilder.makePackageSet ({
                packageFun = import "${self}/Cargo.nix";
                rustVersion = "1.61.0";
                workspaceSrc =
                  pkgs.nix-gitignore.gitignoreRecursiveSource [
                    "*.nix"
                    "*.yml"
                    "/.github"
                    "flake.lock"
                    "LICENSE"
                    "rust-toolchain.toml"
                  ]
                  self;
              }
              // args))
            .workspace
            ."${cargo.toml.package.name}" {})
          .bin;

        mkReleaseBin = mkBin {};

        nativeBin = mkReleaseBin pkgs;
        x86_64LinuxMuslBin = mkReleaseBin pkgsX86_64LinuxMusl;

        mkDebugBin = mkBin {release = false;};

        nativeDebugBin = mkDebugBin pkgs;
        x86_64LinuxMuslDebugBin = mkDebugBin pkgsX86_64LinuxMusl;

        buildImage = bin:
          pkgs.dockerTools.buildImage {
            inherit (cargo.toml.package) name;
            tag = cargo.toml.package.version;
            contents = [
              bin
            ];
            config.Cmd = [cargo.toml.package.name];
            config.Env = ["PATH=${bin}/bin"];
          };
      in {
        formatter = pkgs.alejandra;

        packages = {
          "${cargo.toml.package.name}" = nativeBin;
          "${cargo.toml.package.name}-x86_64-unknown-linux-musl" = x86_64LinuxMuslBin;
          "${cargo.toml.package.name}-x86_64-unknown-linux-musl-oci" = buildImage x86_64LinuxMuslBin;

          "${cargo.toml.package.name}-debug" = nativeDebugBin;
          "${cargo.toml.package.name}-debug-x86_64-unknown-linux-musl" = x86_64LinuxMuslDebugBin;
          "${cargo.toml.package.name}-debug-x86_64-unknown-linux-musl-oci" = buildImage x86_64LinuxMuslDebugBin;
        };
        packages.default = nativeBin;

        devShells.default = pkgs.mkShell {
          buildInputs = [
            pkgs.openssl

            cargo2nixBin

            devRust
          ];
        };
      }
    );
}