{ pkgs
, config
, lib
, ...
}:
let
cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
packageName = cargoToml.package.name;
packageVersion = cargoToml.package.version;
packageDescription = cargoToml.package.description or "";
in
{
# Set root explicitly for flake compatibility
devenv.root = lib.mkDefault (builtins.toString ./.);
dotenv.enable = true;
imports = [
./nix/rust.nix
];
# Additional packages for development
packages = [
pkgs.git
pkgs.pkg-config
];
# Development scripts
scripts.dev-test.exec = ''
echo "Running tests..."
cargo test --all-features
'';
scripts.dev-run.exec = ''
echo "Running ${packageName}..."
cargo run --release
'';
scripts.dev-build.exec = ''
echo "Building ${packageName}..."
cargo build --release
'';
# Environment variables
env = {
CARGO_TARGET_DIR = "./target";
};
# Development shell setup
enterShell = ''
clear
${pkgs.figlet}/bin/figlet "${packageName}"
echo
{
${pkgs.lib.optionalString (packageDescription != "") ''echo "• ${packageDescription}"''}
echo -e "• \033[1mv${packageVersion}\033[0m"
echo -e " \033[0;32m✓\033[0m Development environment ready"
} | ${pkgs.boxes}/bin/boxes -d stone -a l -i none
echo
echo "Available scripts:"
echo " dev-test - Run tests"
echo " dev-run - Run the application"
echo " dev-build - Build the application"
echo ""
'';
# https://devenv.sh/git-hooks/
git-hooks.settings.rust.cargoManifestPath = "./Cargo.toml";
# Use the same Rust toolchain for git-hooks as for development
git-hooks.tools = {
cargo = lib.mkForce config.languages.rust.toolchainPackage;
clippy = lib.mkForce config.languages.rust.toolchainPackage;
rustfmt = lib.mkForce config.languages.rust.toolchainPackage;
};
git-hooks.hooks = {
rustfmt.enable = true;
clippy.enable = true;
};
# https://devenv.sh/tasks/
tasks = {
"test:fmt" = {
exec = "cargo fmt --check";
};
"test:clippy" = {
exec = "cargo clippy --quiet -- -D warnings";
};
"test:check" = {
exec = "cargo check --quiet";
};
"test:unit" = {
exec = "cargo test --quiet";
};
};
# https://devenv.sh/tests/
enterTest = lib.mkForce "devenv tasks run test:fmt test:clippy test:check test:unit";
}