# -*- mode: sh; sh-shell: bash -*-
# vim: set ft=bash:
# shellcheck shell=bash
# shellcheck disable=2016

### General support rules for Rust/Cargo projects
###
### Checks whenever we are in a cargo project.
### Hooks cargo support into the 'std_rules'

## Successful when 'cargo' is available.
rule is_cargo_installed: 'is_command_installed cargo'

function has_cargo_manifest ## Checks if 'Cargo.toml' exists.
{
    if [[ -f "Cargo.toml" ]]; then
        debug "is cargo project"
        return 0
    else
        trace "is not a cargo project"
        return 1
    fi
}

memofn has_cargo_manifest

## Check whenever we are ready to use cargo here.
rule is_cargo_project: --conclusive !has_cargo_manifest -- '
     false
'
rule is_cargo_project: --conclusive !is_cargo_installed -- '
     warn "cargo not available on this system"
     false
'
rule is_cargo_project: -- true

rule lint_sources: is_cargo_project? cargo_lint??
rule build_unit_tests: is_cargo_project? cargo_build_unit_tests
rule test_units: is_cargo_project? cargo_test_units

rule build_integration_tests: is_cargo_project? cargo_build_integration_tests
rule test_integrations: is_cargo_project? cargo_test_integrations

rule test_expensive: is_cargo_project? cargo_outdated
rule test_expensive: is_cargo_project? cargo_miri
rule test_expensive: is_cargo_project? cargo_check_msrv
rule test_expensive: is_cargo_project? cargo_mutants

rule audit: is_cargo_project? cargo_audit
rule audit: is_cargo_project? cargo_audit

rule build_libs: is_cargo_project? 'cargo_build --lib --quiet'
rule build_bins: is_cargo_project? 'cargo build --bins --quiet'
rule build_docs: is_cargo_project? 'cargo_doc --quiet'

rule build_benches: is_cargo_project? 'cargo_build --benches --quiet'
rule build_examples: is_cargo_project? 'cargo_build --examples --quiet'

rule clean: is_cargo_project? 'cargo clean'

rule testdir_enter_hook: is_cargo_project? cargo_cache_artifacts

rule fmt: is_cargo_project? cargo_fmt
rule update: is_cargo_project? cargo_update
rule fix: is_cargo_project? cargo_fix

# running benchmarks
rule benchmark: is_cargo_project? cargo_bench

rule release_current_version: is_cargo_project? 'is_cargo_tool_installed metadata --help' 'is_command_installed jq' -- '
     cargo metadata --no-deps --format-version 1 | jq -r ".packages[0].version"
'

rule release_prepare: is_cargo_project? 'is_cargo_tool_installed set-version' 'release_state_matches start' -- '
     cargo set-version $(release_version)
'
rule release_prepare: is_cargo_project? is_git_repository? 'release_state_matches start' -- '
     git add "Cargo.toml"
'

## Push a software release to crates.io (or whatever registry is configured).
rule release_publish: is_cargo_project? cargo_publish

# Define --bare rules for cargo_rules query/predicate functions
rule --bare has_cargo_manifest: -
