openapp-sdk 0.1.60

Official Rust SDK for OpenApp — Physical Security as a Service (PSaaS): API-first access control for doors, gates, intercom, invitations, and audit.
Documentation
# packages/sdk/rust — user-facing Rust crate (`openapp-sdk`) over core.

import "../../../justfiles/common.just"

_pkg := source_directory()
_compose := source_directory() / ".." / "docker" / "compose.yaml"

# nextest JUnit + tier1 JUnit for merged Allure (`scripts/sdk_merge_allure_results.py`).
_rust_test_with_reports := "mkdir -p .tmp/sdk-reports && " \
    + "cargo nextest run -P sdk-allure && " \
    + "cp target/nextest/sdk-allure/junit-sdk-rust.xml .tmp/sdk-reports/ && " \
    + "bash scripts/run_tier1_junit.sh .tmp/sdk-reports"

_:
    @just --list

# Consumer crate: commands under packages/sdk/rust in sdk-rust.
_rust *ARGS:
    SDK_DOCKER_UID="${SDK_DOCKER_UID:-$(id -u)}" SDK_DOCKER_GID="${SDK_DOCKER_GID:-$(id -g)}" docker compose -f {{ _compose }} run --rm sdk-rust \
        sh -euxc '{{ ARGS }}'

# Chain multiple cargo invocations in one container.
_rust_cmd CMD:
    SDK_DOCKER_UID="${SDK_DOCKER_UID:-$(id -u)}" SDK_DOCKER_GID="${SDK_DOCKER_GID:-$(id -g)}" docker compose -f {{ _compose }} run --rm sdk-rust \
        sh -euxc '{{ CMD }}'

# Core workspace (OpenAPI generator lives in crates/common).
_core *ARGS:
    SDK_DOCKER_UID="${SDK_DOCKER_UID:-$(id -u)}" SDK_DOCKER_GID="${SDK_DOCKER_GID:-$(id -g)}" docker compose -f {{ _compose }} run --rm sdk-core \
        sh -euxc 'cd crates/common && {{ ARGS }}'

build:
    @just _rust cargo build

test:
    @just _rust_cmd '{{ _rust_test_with_reports }}'

lint:
    @just _rust_cmd 'cargo fmt --all -- --check && cargo clippy --all-targets --all-features -- -D warnings'

# OpenAPI drift for Rust core-generated sources (runs in sdk-core workspace).
openapi-check:
    @just _core cargo run --features openapi-gen --bin openapp-sdk-openapi-gen -- --check

# Regenerate core OpenAPI-derived Rust (`packages/sdk/core`); this crate consumes it via path dep.
generate:
    @just _core cargo run --features openapi-gen --bin openapp-sdk-openapi-gen

# Single source of truth for fmt/clippy/build/test (host or sdk-rust container).
_rust_gate_cmd := "cargo fmt --all -- --check && cargo clippy --all-targets --all-features -- -D warnings && cargo build && cargo test"

# Host toolchain — matches `.github/workflows/sdk-unified-release.yml` (not Docker `just sdk docker rust`).
# OpenAPI drift for this crate is `openapi-check` below; release CI runs `just sdk openapi-check` (includes it) before this recipe — do not duplicate here.
release-gate:
    {{ _rust_gate_cmd }}

# Invoked from repo root via `scripts/pre-commit-subproject-wrapper.sh packages/sdk/rust`.
# Runs `openapi-check` then the same cargo chain as `release-gate` (in Docker). Full release still needs `just sdk openapi-check` once at the coordinator.
pre-commit: openapi-check
    @just _rust_cmd '{{ _rust_gate_cmd }}'

# crates.io consumer crate (`openapp-sdk`). Host `cargo` (same as core publish / CI).
# Requires `openapp-sdk-core` on crates.io first (from repo root: `just sdk core publish`
# then `just sdk rust publish`, or `sdk-unified-release.yml`).
publish *ARGS:
    #!/usr/bin/env bash
    set -euo pipefail
    cd "{{ _pkg }}"
    log="$(mktemp)"
    set +e
    cargo publish {{ ARGS }} 2>&1 | tee "$log"
    st="${PIPESTATUS[0]}"
    set -e
    if [[ "$st" -eq 0 ]]; then
      rm -f "$log"
      exit 0
    fi
    if grep -qiE 'already exists|already uploaded|duplicate version|version.*already' "$log"; then
      echo "Skipping openapp-sdk: same version already on crates.io." >&2
      rm -f "$log"
      exit 0
    fi
    cat "$log" >&2
    rm -f "$log"
    exit "$st"