-
Notifications
You must be signed in to change notification settings - Fork 0
Dependency Graph
Generated from cargo metadata. Mermaid blocks render directly on the GitHub
wiki; for local inspection paste into https://mermaid.live or any
Mermaid-aware viewer.
xtask is omitted (no workspace deps; build-tooling only).
graph TD
classDef foundation fill:#dfe3ee,stroke:#34495e,color:#000
classDef physics fill:#e8f0d8,stroke:#27ae60,color:#000
classDef gateway fill:#ffeaa7,stroke:#fdcb6e,stroke-width:2px,color:#000
classDef consumer fill:#dceffb,stroke:#3498db,color:#000
classDef verif fill:#f9d6d6,stroke:#c0392b,color:#000
quantities[astrodyn_quantities]:::foundation
math[astrodyn_math]:::physics
time[astrodyn_time]:::physics
planet[astrodyn_planet]:::physics
ephemeris[astrodyn_ephemeris]:::physics
frames[astrodyn_frames]:::physics
atmosphere[astrodyn_atmosphere]:::physics
dynamics[astrodyn_dynamics]:::physics
gravity[astrodyn_gravity]:::physics
interactions[astrodyn_interactions]:::physics
astrodyn["<b>astrodyn</b><br/><i>gateway / root</i>"]:::gateway
runner[astrodyn_runner]:::consumer
bevy[astrodyn_bevy]:::consumer
verif_jeod[astrodyn_verif_jeod]:::verif
verif_parity[astrodyn_verif_parity]:::verif
%% physics depends on foundation
math --> quantities
time --> quantities
planet --> quantities
ephemeris --> quantities
frames --> quantities
atmosphere --> quantities
dynamics --> quantities
gravity --> quantities
interactions --> quantities
%% physics inter-deps
frames --> math
dynamics --> math
dynamics --> frames
gravity --> math
gravity --> dynamics
interactions --> atmosphere
interactions --> dynamics
%% gateway pulls everything
astrodyn --> atmosphere
astrodyn --> dynamics
astrodyn --> ephemeris
astrodyn --> frames
astrodyn --> gravity
astrodyn --> interactions
astrodyn --> math
astrodyn --> planet
astrodyn --> quantities
astrodyn --> time
%% consumers go through the gateway and only the gateway
bevy --> astrodyn
runner --> astrodyn
%% verification
verif_jeod --> astrodyn
verif_jeod --> runner
verif_jeod -.-> atmosphere
verif_jeod -.-> dynamics
verif_jeod -.-> ephemeris
verif_jeod -.-> frames
verif_jeod -.-> gravity
verif_jeod -.-> interactions
verif_jeod -.-> math
verif_jeod -.-> quantities
verif_jeod -.-> time
verif_parity --> astrodyn
verif_parity --> bevy
verif_parity --> runner
verif_parity --> verif_jeod
verif_parity -.-> dynamics
verif_parity -.-> gravity
verif_parity -.-> quantities
Solid arrows are direct deps the crate explicitly lists; dashed arrows are
direct deps that also arrive transitively through astrodyn.
Layer semantics (Three-Layer Architecture)
-
Foundation —
astrodyn_quantities(typed-quantities phantoms). -
Physics layer — pure Rust, zero Bevy dep. Each
astrodyn_*crate owns one slice of the JEOD port (math, frames, gravity, …). -
Gateway —
astrodynis the single API surface for the production path. Every Bevy system, every mission crate, every published consumer reads the workspace throughastrodynand only throughastrodyn. -
Consumers —
astrodyn_bevy(ECS adapter, mission code's runtime) andastrodyn_runner(arena harness for batch propagation; no JEOD specifics). Both consumers depend onastrodynand onlyastrodynfor physics: a CI lint (scripts/check_no_bypass_deps.sh) fails the build if either crate declares a directastrodyn_*physics-crate dep. -
Verification —
astrodyn_verif_jeodowns every JEOD parser, fixture, scenario rig, type, and tier-3 test;astrodyn_verif_parityasserts bit-identical state between runner and Bevy.
The verification crates are the explicit exception: they reach physics crates directly because they need internals to construct test fixtures and drive Tier-3 oracles. Mission-path consumers do not.
graph TD
classDef gateway fill:#ffeaa7,stroke:#fdcb6e,stroke-width:2px,color:#000
classDef consumer fill:#dceffb,stroke:#3498db,color:#000
classDef physics fill:#e8f0d8,stroke:#27ae60,color:#000
bevy[astrodyn_bevy]:::consumer
astrodyn[<b>astrodyn</b><br/>gateway]:::gateway
physics["10 × astrodyn_*<br/>(physics + ephemeris)"]:::physics
bevy_ext[bevy 0.18]
bevy --> astrodyn
bevy --> bevy_ext
astrodyn --> physics
A mission crate that wants to ship code into Bevy depends on
astrodyn_bevy and bevy; that's the entire surface. The 10 physics crates
sit behind the gateway and only get pulled in transitively.
→ regular dep, ⇢ dev-dep.
astrodyn:
→ astrodyn_atmosphere
→ astrodyn_dynamics
→ astrodyn_ephemeris
→ astrodyn_frames
→ astrodyn_gravity
→ astrodyn_interactions
→ astrodyn_math
→ astrodyn_planet
→ astrodyn_quantities
→ astrodyn_time
astrodyn_atmosphere:
→ astrodyn_quantities
⇢ astrodyn_verif_jeod
astrodyn_bevy:
→ astrodyn
⇢ astrodyn_runner
⇢ astrodyn_verif_jeod
astrodyn_dynamics:
→ astrodyn_frames
→ astrodyn_math
→ astrodyn_quantities
⇢ astrodyn_gravity
⇢ astrodyn_planet
⇢ astrodyn_verif_jeod
astrodyn_ephemeris:
→ astrodyn_quantities
astrodyn_frames:
→ astrodyn_math
→ astrodyn_quantities
⇢ astrodyn_time
⇢ astrodyn_verif_jeod
astrodyn_gravity:
→ astrodyn_dynamics
→ astrodyn_math
→ astrodyn_quantities
⇢ astrodyn_frames
⇢ astrodyn_time
astrodyn_interactions:
→ astrodyn_atmosphere
→ astrodyn_dynamics
→ astrodyn_quantities
⇢ astrodyn_ephemeris
⇢ astrodyn_gravity
⇢ astrodyn_math
⇢ astrodyn_planet
⇢ astrodyn_time
⇢ astrodyn_verif_jeod
astrodyn_math:
→ astrodyn_quantities
⇢ astrodyn_ephemeris
⇢ astrodyn_planet
⇢ astrodyn_verif_jeod
astrodyn_planet:
→ astrodyn_quantities
⇢ astrodyn_math
astrodyn_quantities: (foundation — no workspace deps)
astrodyn_runner:
→ astrodyn
astrodyn_time:
→ astrodyn_quantities
astrodyn_verif_jeod:
→ astrodyn
→ astrodyn_atmosphere
→ astrodyn_dynamics
→ astrodyn_ephemeris
→ astrodyn_frames
→ astrodyn_gravity
→ astrodyn_interactions
→ astrodyn_math
→ astrodyn_quantities
→ astrodyn_runner
→ astrodyn_time
astrodyn_verif_parity:
→ astrodyn
→ astrodyn_bevy
→ astrodyn_dynamics
→ astrodyn_gravity
→ astrodyn_quantities
→ astrodyn_runner
→ astrodyn_verif_jeod
cargo build --workspace and cargo tree --workspace succeed — Cargo
would refuse the build on any cycle in the regular-dep graph. The
mission-path graph is now a clean DAG: the only edges into
astrodyn_runner and astrodyn_bevy come from verification crates; both
consumers reach the physics layer only through astrodyn.
# Quick text view (matches the "Full edge listing" above)
cargo metadata --format-version=1 --no-deps | jq -r '
.workspace_members as $ws
| .packages
| map(select(.id as $id | $ws | index($id)))
| map(select(.name != "xtask"))
| sort_by(.name)
| .[]
| . as $pkg
| (
[.dependencies[] | select(.name | startswith("astrodyn"))]
| group_by(.name)
| map({
name: .[0].name,
rank: (if any(.kind == null) then 0 else 1 end),
kind: (if any(.kind == null) then "normal" else "dev" end),
})
| sort_by([.rank, .name])
) as $deps
| "\($pkg.name):" + (
if ($deps | length) == 0 then " (no astrodyn_* workspace deps)"
else "\n" + ($deps | map(" \(if .kind == "dev" then "⇢" else "→" end) \(.name)") | join("\n"))
end
)
'
# Or just inspect Cargo.toml files
for f in Cargo.toml crates/*/Cargo.toml; do
echo "=== $f ==="
awk '/\[(dev-)?dependencies\]/,/^\[/' "$f" | grep -E '^astrodyn_'
done