# Based off of:
# https://github.com/NixOS/nixpkgs/blob/776c3bee4769c616479393aeefceefeda16b6fcb/pkgs/tools/nix/npins/source.nix
{
  lib,
  fetchurl,
  fetchgit,
  fetchzip,
}:
builtins.mapAttrs
(
  _: let
    getZip = {
      url,
      hash,
      ...
    }:
      fetchzip {
        inherit url;
        sha256 = hash;
        extension = "tar";
      };
    mkGitSource = {
      repository,
      revision,
      url ? null,
      hash,
      ...
    } @ attrs:
      assert repository ? type;
        if url != null
        then getZip attrs
        else
          assert repository.type == "Git"; let
            urlToName = url: rev: let
              matched = builtins.match "^.*/([^/]*)(\\.git)?$" repository.url;
              short = builtins.substring 0 7 rev;
              appendShort =
                if (builtins.match "[a-f0-9]*" rev) != null
                then "-${short}"
                else "";
            in "${
              if matched == null
              then "source"
              else builtins.head matched
            }${appendShort}";
            name = urlToName repository.url revision;
          in
            fetchgit {
              inherit name;
              inherit (repository) url;
              rev = revision;
              sha256 = hash;
            };

    mkPyPiSource = {
      url,
      hash,
      ...
    }:
      fetchurl {
        inherit url;
        sha256 = hash;
      };
  in
    spec:
      assert spec ? type; let
        func =
          {
            Git = mkGitSource;
            GitRelease = mkGitSource;
            PyPi = mkPyPiSource;
            Channel = getZip;
          }
          .${spec.type}
          or (builtins.throw "Unknown source type ${spec.type}");
      in
        spec // {outPath = func spec;}
)
(
  let
    json = lib.importJSON ./sources.json;
  in
    assert lib.assertMsg (json.version == 3) "Npins version mismatch!";
      json.pins
)