{
system,
lib,
stdenv,
libiconv,
darwin,
inputs,
rustPlatform,
rust-analyzer,
cargo-release,
}: let
inherit (inputs) crane advisory-db;
craneLib = crane.lib.${system};
commonArgs' = {
src = craneLib.cleanCargoSource (craneLib.path ../../.);
nativeBuildInputs = lib.optionals stdenv.isDarwin [
# Additional darwin specific inputs can be set here
(libiconv.override {
enableStatic = true;
enableShared = false;
})
darwin.apple_sdk.frameworks.CoreServices
];
};
# Build *just* the cargo dependencies, so we can reuse
# all of that work (e.g. via cachix) when running in CI
cargoArtifacts = craneLib.buildDepsOnly commonArgs';
commonArgs =
commonArgs'
// {
inherit cargoArtifacts;
};
checks = {
utf8-command-tests = craneLib.cargoNextest (commonArgs
// {
NEXTEST_HIDE_PROGRESS_BAR = "true";
});
utf8-command-clippy = craneLib.cargoClippy (commonArgs
// {
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
});
utf8-command-rustdoc = craneLib.cargoDoc (commonArgs
// {
cargoDocExtraArgs = "--document-private-items";
RUSTDOCFLAGS = "-D warnings";
});
utf8-command-fmt = craneLib.cargoFmt commonArgs;
utf8-command-audit = craneLib.cargoAudit (commonArgs
// {
inherit advisory-db;
});
};
devShell = craneLib.devShell {
inherit checks;
# Make rust-analyzer work
RUST_SRC_PATH = rustPlatform.rustLibSrc;
# Extra development tools (cargo and rustc are included by default).
packages = [
rust-analyzer
cargo-release
];
};
in
# Build the actual crate itself, reusing the dependency
# artifacts from above.
craneLib.buildPackage (commonArgs
// {
# Don't run tests; we'll do that in a separate derivation.
doCheck = false;
passthru = {
inherit
checks
devShell
commonArgs
craneLib
;
};
})