with import <nixpkgs> {};

let h2-lwt = ocamlPackages.buildDunePackage rec {
      pname = "h2-lwt";
      version = "0.12.0";
      src = pkgs.fetchurl {
        url = "https://github.com/anmonteiro/ocaml-h2/releases/download/0.12.0/h2-0.12.0.tbz";
        sha256 = "sha256-NuQLET2Q6jg2GajHvZk/hmExw8XZV2GbaEnrMq+MU8Y=";
      };
      propagatedBuildInputs = with pkgs; [
        h2
        ocamlPackages.faraday-async
        ocamlPackages.gluten-lwt
        ocamlPackages.gluten-async
      ];
    };

    h2-lwt-unix = ocamlPackages.buildDunePackage rec {
      pname = "h2-lwt-unix";
      version = "0.12.0";
      src = pkgs.fetchurl {
        url = "https://github.com/anmonteiro/ocaml-h2/releases/download/0.12.0/h2-0.12.0.tbz";
        sha256 = "sha256-NuQLET2Q6jg2GajHvZk/hmExw8XZV2GbaEnrMq+MU8Y=";
      };
      propagatedBuildInputs = with pkgs; [
        h2-lwt
        ocamlPackages.faraday-lwt-unix
        ocamlPackages.gluten-lwt-unix
      ];
    };

    h2 = ocamlPackages.buildDunePackage rec {
      pname = "h2";
      version = "0.12.0";
      src = pkgs.fetchurl {
        url = "https://github.com/anmonteiro/ocaml-h2/releases/download/0.12.0/h2-0.12.0.tbz";
        sha256 = "sha256-NuQLET2Q6jg2GajHvZk/hmExw8XZV2GbaEnrMq+MU8Y=";
      };
      propagatedBuildInputs = with pkgs; [
        ocamlPackages.base64
        ocamlPackages.angstrom
        ocamlPackages.faraday
        ocamlPackages.bigstringaf
        ocamlPackages.psq
        ocamlPackages.hpack
        ocamlPackages.httpun-types
        ocamlPackages.alcotest
        ocamlPackages.yojson
        ocamlPackages.hex
      ];
    };

    grpc-src = pkgs.fetchFromGitHub {
      owner = "dialohq";
      repo = "ocaml-grpc";
      rev = "0.2.0";
      sha256 = "sha256-YARAm3EVTbptAoKA0lysJRYeKPaCaeWU6X9Lzkn+30E=";
    };

    grpc = ocamlPackages.buildDunePackage rec {
      pname = "grpc";
      version = "0.2.0";
      src = grpc-src;
      propagatedBuildInputs = with pkgs; [
        ocamlPackages.uri
        h2
        ocamlPackages.ppx_deriving
        ocamlPackages.ppxlib
      ];
    };

    grpc-lwt = ocamlPackages.buildDunePackage rec {
      pname = "grpc-lwt";
      version = "0.2.0";
      src = grpc-src;
      propagatedBuildInputs = with pkgs; [
        ocamlPackages.stringext
        ocamlPackages.lwt
        grpc
      ];
    };
in
clangStdenv.mkDerivation {
  name = "elpe";
  buildInputs = [
    openssl nettle zstd.dev sequoia-sq
    xz.dev
    pkg-config
    ocaml
    opam
    ocamlPackages.ocaml
    ocamlPackages.dune_3
    ocamlPackages.ocaml-protoc
    ocamlPackages.findlib
    ocamlPackages.core
    ocamlPackages.core_unix
    ocamlPackages.ocaml-protoc-plugin
    grpc-lwt
    h2-lwt-unix
    ocamlformat
    protobuf
    checksec
    linuxPackages_latest.perf
  ];
  nativeBuildInputs = [ pkg-config b3sum ];
  LIBCLANG_PATH="${llvmPackages.libclang.lib}/lib";
  PROTOC="${protobuf}/bin/protoc";
}