# kyle: toml
name = "snmpkit"

# Setup
[tasks.setup]
desc = "Install all development dependencies"
run = "kyle setup:rust && kyle setup:uv && kyle setup:pdm && kyle setup:bun && kyle setup:deps"

[tasks."setup:rust"]
desc = "Install Rust via rustup"
run = "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y"

[tasks."setup:uv"]
desc = "Install uv (PDM resolves and installs through it)"
run = "curl -LsSf https://astral.sh/uv/install.sh | sh"

[tasks."setup:pdm"]
desc = "Install PDM package manager"
run = "curl -sSL https://pdm-project.org/install-pdm.py | python3 -"

[tasks."setup:bun"]
desc = "Install bun runtime"
run = "curl -fsSL https://bun.sh/install | bash"

[tasks."setup:deps"]
desc = "Install project dependencies"
run = "pdm install -G dev && cd docs && bun install"

# Build
[tasks.build]
desc = "Build release (Python + Rust)"
run = "pdm run maturin build --release"

[tasks.dev]
desc = "Install in development mode"
run = "pdm run refresh:rust"

# Refresh (rebuild without reinstalling toolchains)
[tasks.refresh]
desc = "Rebuild the extension and refresh dev dependencies"
run = "pdm run refresh"

[tasks."refresh:rust"]
desc = "Rebuild the Rust extension into the venv"
run = "pdm run refresh:rust"

[tasks."refresh:python"]
desc = "Sync Python dev dependencies to pdm.lock"
run = "pdm run refresh:python"

[tasks."refresh:docs"]
desc = "Refresh docs dependencies"
run = "pdm run refresh:docs"

# Test
[tasks.test]
desc = "Run all tests"
run = "kyle test:rust && kyle test:python"

[tasks."test:rust"]
desc = "Run Rust tests"
run = "cargo test"

[tasks."test:python"]
desc = "Run Python tests (parallel)"
run = "pdm run test"

[tasks."test:interop"]
desc = "Interop tests against a real net-snmp agent, in a container"
run = "kyle interop:build && kyle interop:run"

[tasks."interop:build"]
desc = "Build the interop container image"
run = "podman build -f tests/interop/Containerfile -t snmpkit-interop ."

[tasks."interop:run"]
desc = "Run the interop suite in the container"
run = "podman run --rm snmpkit-interop"

[tasks."interop:shell"]
desc = "Shell into the interop container"
run = "podman run --rm -it snmpkit-interop bash"

# Format
[tasks.format]
desc = "Format all code"
run = "kyle format:rust && kyle format:python && kyle format:docs"

[tasks."format:rust"]
desc = "Format Rust code"
run = "cargo fmt"

[tasks."format:python"]
desc = "Format Python code"
run = "pdm run fmt"

[tasks."format:docs"]
desc = "Format docs code"
run = "cd docs && bun run format"

# Lint
[tasks.lint]
desc = "Lint all code"
run = "kyle lint:rust && kyle lint:python && kyle lint:docs"

[tasks."lint:rust"]
desc = "Lint Rust code"
run = "cargo clippy -- -D warnings"

[tasks."lint:python"]
desc = "Lint Python code"
run = "pdm run lint"

[tasks."lint:docs"]
desc = "Lint docs code"
run = "cd docs && bun run lint"

# Check (type checking)
[tasks.check]
desc = "Type check all code"
run = "kyle check:rust && kyle check:python && kyle check:docs"

[tasks."check:rust"]
desc = "Type check Rust code"
run = "cargo check && cargo clippy"

[tasks."check:python"]
desc = "Type check Python code"
run = "pdm run lint"

[tasks."check:docs"]
desc = "Type check docs (tsgo)"
run = "cd docs && bun run check"

# Dependencies
[tasks.lock]
desc = "Regenerate pdm.lock"
run = "pdm lock"

[tasks."deps:outdated"]
desc = "Show outdated dependencies"
run = "pdm outdated"

[tasks."deps:frozen"]
desc = "Install exactly what pdm.lock pins, without re-resolving"
run = "pdm install -G dev --frozen-lockfile"

[tasks."deps:sync"]
desc = "Sync the venv to pdm.lock exactly"
run = "pdm sync -G dev --clean"

# Benchmarks
[tasks.bench]
desc = "Run all benchmarks (snmpkit vs pysnmp/pysmi)"
run = "kyle bench:deps && pdm run bench"

[tasks."bench:deps"]
desc = "Install the comparison libraries the benchmarks need"
run = "pdm install -G dev -G bench --frozen-lockfile"

# Docs
[tasks."docs:dev"]
desc = "Start docs dev server"
run = "cd docs && bun run dev"

[tasks."docs:build"]
desc = "Build docs for production"
run = "cd docs && bun run build"

# Clean
[tasks.clean]
desc = "Clean build artifacts"
run = "cargo clean && rm -rf dist/ build/ *.egg-info .venv docs/.next docs/node_modules"

# Pre-commit
[tasks.pre-commit]
desc = "Run pre-commit checks"
run = "cargo fmt --check && cargo clippy -- -D warnings && pdm run fmt-check"

# Publish
[tasks.publish]
desc = "Publish to PyPI"
run = "pdm run maturin publish"
deps = ["test", "lint"]
