1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# 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"