buffrs 0.13.0

Modern protobuf package management
Documentation
{ fetchurl, runCommand, lib, buffrs, symlinkJoin, }:

lockfile:

let
  src = runCommand "vendor-lockfile" { } ''
    mkdir -p $out
    cp ${lockfile} $out/Proto.lock
  '';

  fileRequirementsJson =
    runCommand "buffrs-urls" { buildInputs = [ buffrs ]; } ''
      cd ${src}
      buffrs lock print-files > $out
    '';

  fileRequirements = builtins.fromJSON (builtins.readFile fileRequirementsJson);

  cachePackage = (file:
    let
      prefix = "sha256:";

      sha256 = assert lib.strings.hasPrefix prefix file.digest;
        lib.strings.removePrefix prefix file.digest;

      tar = fetchurl {
        inherit sha256;
        url = file.url;
      };
    in runCommand "cache-${file.package}" { } ''
      mkdir -p $out
      cp ${tar} $out/${file.package}.sha256.${sha256}.tgz
    '');

  cache = map cachePackage fileRequirements;
in {
  BUFFRS_CACHE = symlinkJoin {
    name = "buffrs-cache";
    paths = cache;
  };
}