# donglora-protocol development tasks

# default: list all recipes
default:
    @just --list

# run ALL quality gates (tests, clippy, fmt, doc, deny, fuzz, miri, mutants)
test: test-unit test-clippy test-fmt test-doc test-deny test-fuzz test-miri test-mutants

# quick compile check (all feature permutations)
check:
    cargo check
    cargo check --no-default-features
    cargo check --all-features

# unit + proptest + doc tests
test-unit:
    cargo nextest run
    cargo nextest run --no-default-features
    cargo nextest run --all-features
    cargo test --doc

# clippy with warnings as errors across feature permutations
test-clippy:
    cargo clippy --all-targets -- -D warnings
    cargo clippy --all-targets --no-default-features -- -D warnings
    cargo clippy --all-targets --all-features -- -D warnings

# check formatting
test-fmt:
    cargo fmt -- --check

# doc build (catches broken doc links)
test-doc:
    cargo doc --no-deps --all-features

# license and advisory audit
test-deny:
    cargo deny check

# fuzz every target for 60s (requires nightly + cargo-fuzz)
test-fuzz:
    cd fuzz && cargo +nightly fuzz run decoder_feed -- -max_total_time=60
    cd fuzz && cargo +nightly fuzz run parse_command -- -max_total_time=60
    cd fuzz && cargo +nightly fuzz run parse_device_message -- -max_total_time=60
    cd fuzz && cargo +nightly fuzz run frame_roundtrip -- -max_total_time=60
    cd fuzz && cargo +nightly fuzz run lora_config_roundtrip -- -max_total_time=60

# run tests under miri (catches UB, requires nightly + miri component)
# The proptest suite is skipped — its file-persistence layer calls getcwd
# which miri does not support. Vectors and unit tests run clean.
test-miri:
    cargo +nightly miri nextest run --lib --test vectors
    cargo +nightly miri nextest run --lib --test vectors --no-default-features

# mutation testing (requires cargo-mutants).
#
# Runs under both feature configurations so that feature-gated paths
# (currently only the defmt::Format derives) are covered in both shapes.
# No exclusions yet for the v1.0 codec — rerun mutation testing on a
# fresh target and add `-E` lines here for any provably-equivalent
# mutants that survive, with a comment explaining why.
test-mutants: test-mutants-default test-mutants-no-default

test-mutants-default:
    cargo mutants --no-shuffle --test-tool=nextest

test-mutants-no-default:
    cargo mutants --no-shuffle --test-tool=nextest --no-default-features

# format code
fmt:
    cargo fmt

# build in release mode
build:
    cargo build --release

# clean all build artifacts
clean:
    cargo clean
    rm -rf fuzz/target fuzz/corpus fuzz/artifacts
