korrosync 0.3.0

A KOReader Sync Server
Documentation
{
  description = "KOReader Sync Server";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    flake-parts.url = "github:hercules-ci/flake-parts";

    git-hooks-nix = {
      url = "github:cachix/git-hooks.nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    treefmt-nix = {
      url = "github:numtide/treefmt-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = inputs @ {flake-parts, ...}:
    flake-parts.lib.mkFlake {inherit inputs;} {
      systems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];

      imports = [
        inputs.git-hooks-nix.flakeModule
        inputs.treefmt-nix.flakeModule
      ];

      perSystem = let
        targets = [
          "aarch64-unknown-linux-gnu"
          "aarch64-unknown-linux-musl"

          "armv7-unknown-linux-gnueabihf"
          "armv7-unknown-linux-musleabihf"

          "x86_64-unknown-linux-gnu"
          "x86_64-unknown-linux-musl"

          "aarch64-apple-darwin"
          "x86_64-apple-darwin"

          "x86_64-pc-windows-gnu"
        ];
      in
        {
          config,
          system,
          ...
        }: let
          overlays = [(import inputs.rust-overlay)];
          pkgs = import inputs.nixpkgs {
            inherit system overlays;
          };

          rustToolchain = pkgs.rust-bin.stable.latest.default.override {
            extensions = [
              "rust-src"
              "rust-analyzer"
              "llvm-tools-preview"
            ];
            inherit targets;
          };

          buildInputs = with pkgs;
            [
              openssl
              pkg-config
            ]
            ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
              pkgs.darwin.apple_sdk.frameworks.Security
              pkgs.darwin.apple_sdk.frameworks.SystemConfiguration
            ];
        in {
          devShells.default = pkgs.mkShell {
            inherit buildInputs;
            nativeBuildInputs = with pkgs; [
              rustToolchain
              bacon
              cargo-edit
              cargo-machete
              cargo-zigbuild
              cargo-tarpaulin
              cargo-audit
              cargo-deny
              cargo-llvm-cov
              just

              zig
              grcov
            ];

            shellHook = ''
              ${config.pre-commit.installationScript}

              echo "Rust development environment loaded"
              echo "Rust version: $(rustc --version)"
              echo ""
              echo "Cross-compile with: cargo zigbuild --target <target>"
              echo ""
              echo -n "Available targets: ${pkgs.lib.strings.concatStringsSep ", " targets}"
              echo ""
            '';
          };

          packages = let
            cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
            mkRustPackage = toolchain:
              toolchain {
                pname = "${cargoToml.package.name}";
                inherit (cargoToml.package) version;

                src = pkgs.lib.cleanSource ./.;
                cargoLock.lockFile = ./Cargo.lock;

                inherit buildInputs;
                nativeBuildInputs = with pkgs; [pkg-config];
              };
          in {
            default = mkRustPackage pkgs.rustPlatform.buildRustPackage;
            static = mkRustPackage pkgs.pkgsStatic.rustPlatform.buildRustPackage;
          };

          pre-commit = {
            check.enable = true;
            settings = {
              hooks = {
                alejandra.enable = true;
                rustfmt.enable = true;
                deadnix.enable = true;
                statix.enable = true;
              };
            };
          };

          treefmt = {
            projectRootFile = "flake.nix";
            programs = {
              alejandra.enable = true;
              deadnix.enable = true;
              statix.enable = true;
              mdformat.enable = true;
            };
            settings = {
              on-unmatched = "info";
            };
          };
        };
    };
}