crane/lib/urlForCargoPackage.nix
Ivan Petkov e80de1e74a
Allow passing arbitrary fetchurl args per registry (#168)
Co-authored-by: Amos Wenger <amoswenger@gmail.com>
2022-11-20 16:22:13 -08:00

64 lines
1.4 KiB
Nix

{ crateRegistries
, lib
}:
{ name
, version
, source
, checksum
, ...
}:
let
substr = builtins.substring;
# https://doc.rust-lang.org/cargo/reference/registries.html
nameLen = builtins.stringLength name;
prefix =
if nameLen == 1 then "1"
else if nameLen == 2 then "2"
else if nameLen == 3 then "3/${substr 0 1 name}"
else "${substr 0 2 name}/${substr 2 4 name}";
registry = crateRegistries.${source} or (throw ''
not sure how to download crates from ${source}.
for example, this can be resolved with:
craneLib = crane.lib.''${system}.appendCrateRegistries [
(lib.registryFromDownloadUrl {
dl = "https://crates.io/api/v1/crates";
indexUrl = "https://github.com/rust-lang/crates.io-index";
})
# Or, alternatively
(lib.registryFromGitIndex {
url = "https://github.com/Hirevo/alexandrie-index";
rev = "90df25daf291d402d1ded8c32c23d5e1498c6725";
})
];
# Then use the new craneLib instance as you would normally
craneLib.buildPackage {
# ...
}
'');
in
{
fetchurlExtraArgs = registry.fetchurlExtraArgs or {};
url = builtins.replaceStrings
[
"{crate}"
"{version}"
"{prefix}"
"{lowerprefix}"
"{sha256-checksum}"
]
[
name
version
prefix
(lib.toLower prefix)
checksum
]
registry.downloadUrl;
}