quickctx 0.1.2

A bidirectional file content aggregator and extractor that converts between files and markdown-formatted representations
Documentation
{
  description = "Nix flake for the openit command-line tool";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs =
    {
      self,
      nixpkgs,
      flake-utils,
      ...
    }:
    flake-utils.lib.eachDefaultSystem (
      system:
      let
        pkgs = import nixpkgs {
          inherit system;
          config.allowUnfree = true;
        };
        lib = pkgs.lib;
        cargoToml = lib.importTOML ./Cargo.toml;
        crateName = cargoToml.package.name;
        crateVersion = cargoToml.package.version;
        nativeBuildInputs = with pkgs; [ pkg-config ];

        # GTK4 dependencies only needed for icon-picker feature
        buildInputs = with pkgs; [
          openssl
        ];

        # Base package without icon-picker
        cratePackage = pkgs.rustPlatform.buildRustPackage {
          pname = crateName;
          version = crateVersion;
          src = lib.cleanSource ./.;
          cargoLock.lockFile = ./Cargo.lock;
          cargoHash = lib.fakeSha256;
          inherit nativeBuildInputs;
          buildInputs = [ ];
          meta = with lib; {
            description = "Small helper to launch applications with custom rules";
            license = licenses.mit;
            maintainers = [ ];
          };
        };

        # Package with icon-picker feature enabled
        cratePackageWithIconPicker = pkgs.rustPlatform.buildRustPackage {
          pname = "${crateName}-with-icon-picker";
          version = crateVersion;
          src = lib.cleanSource ./.;
          cargoLock.lockFile = ./Cargo.lock;
          cargoHash = lib.fakeSha256;
          buildFeatures = [ "icon-picker" ];
          inherit nativeBuildInputs;
          buildInputs = buildInputs;
          meta = with lib; {
            description = "Small helper to launch applications with custom rules (with icon-picker)";
            license = licenses.mit;
            maintainers = [ ];
          };
        };

        # Cross-compilation helper function
        mkCrossPackage =
          crossPkgs: targetName:
          crossPkgs.rustPlatform.buildRustPackage {
            pname = "${crateName}-${targetName}";
            version = crateVersion;
            src = lib.cleanSource ./.;
            cargoLock.lockFile = ./Cargo.lock;
            cargoHash = lib.fakeSha256;

            # Don't include pkg-config for cross-compilation as it often fails
            # and isn't needed for static Rust binaries
            nativeBuildInputs = [ ];
            buildInputs = [ ];

            meta = with lib; {
              description = "Small helper to launch applications with custom rules (${targetName})";
              license = licenses.mit;
              maintainers = [ ];
            };
          };

        # Android build helper function using Nix cross-compilation
        mkAndroidPackage =
          androidPkgs: targetName:
          androidPkgs.rustPlatform.buildRustPackage {
            pname = "${crateName}-android-${targetName}";
            version = crateVersion;
            src = lib.cleanSource ./.;
            cargoLock.lockFile = ./Cargo.lock;
            cargoHash = lib.fakeSha256;

            nativeBuildInputs = [ ];
            buildInputs = [ ];

            # Disable tests for cross-compilation
            doCheck = false;

            meta = with lib; {
              description = "Small helper to launch applications with custom rules (Android ${targetName})";
              license = licenses.mit;
              maintainers = [ ];
            };
          };

      in
      {
        packages = {
          default = cratePackage;
          with-icon-picker = cratePackageWithIconPicker;

          # Cross-platform builds
          # Windows
          windows-x86_64 = mkCrossPackage pkgs.pkgsCross.mingwW64 "windows-x86_64";

          # macOS
          macos-aarch64 = mkCrossPackage pkgs.pkgsCross.aarch64-darwin "macos-aarch64";
          macos-x86_64 = mkCrossPackage pkgs.pkgsCross.x86_64-darwin "macos-x86_64";

          # Linux
          linux-x86_64 = mkCrossPackage pkgs.pkgsCross.gnu64 "linux-x86_64";
          linux-aarch64 = mkCrossPackage pkgs.pkgsCross.aarch64-multiplatform "linux-aarch64";

          # Android builds for common architectures
          android-aarch64 = mkAndroidPackage pkgs.pkgsCross.aarch64-android-prebuilt "aarch64";
          android-armv7 = mkAndroidPackage pkgs.pkgsCross.armv7a-android-prebuilt "armv7";
          android-x86_64 = mkAndroidPackage pkgs.pkgsCross.x86_64-android-prebuilt "x86_64";
        };

        apps.default = {
          type = "app";
          program = "${cratePackage}/bin/${crateName}";
        };

        devShells.default = pkgs.mkShell {
          packages = with pkgs; [
            rustc
            cargo
            clippy
            rustfmt
            rust-analyzer
            cargo-edit
            cargo-deny
            cargo-audit
            cargo-tarpaulin
            cargo-ndk
            rustup
            tokei
          ];

          # Include GTK4 in dev shell for icon-picker development
          buildInputs = buildInputs;
          inherit nativeBuildInputs;
        };

        formatter = pkgs.alejandra;

        checks.build = cratePackage;
      }
    );
}