[pull] master from clockworklabs:master#563
Merged
Merged
Conversation
# Description of Changes
Adds a lifetime-aware `TableAccessor` trait to the Rust SDK and updates
Rust codegen to emit a generated accessor marker type for each table.
Generated bindings now include a marker type like:
```rust
pub struct PlayerPositionTableAccessor;
impl __sdk::TableAccessor<super::RemoteTables> for PlayerPositionTableAccessor {
type Row = PlayerPositionRow;
type Handle<'db> = PlayerPositionTableHandle<'db>;
fn get<'db>(db: &'db super::RemoteTables) -> Self::Handle<'db> {
db.player_position()
}
}
```
The existing generated table access methods remain unchanged:
```rust
fn player_position(&self) -> PlayerPositionTableHandle<'_>;
```
## Motivation
Generated table handles are lifetime-scoped to `RemoteTables`, which
makes it difficult for downstream crates to expose ergonomic generic
APIs over generated table accessors. In particular, a method like
`RemoteTables::player_position` returns a handle whose type depends on
the borrow lifetime of `RemoteTables`, which is hard to represent in
higher-order APIs.
The existing lifetime is not mechanically required by the current handle
storage model: generated table handles own an SDK `TableHandle<Row>`,
which holds shared connection/cache state rather than borrowing from
`RemoteTables`. However, the lifetime does express the conceptual scope
of a handle relative to the database view that produced it.
This PR preserves that scoped API contract instead of removing the
lifetime, and adds a generated marker type so generic downstream APIs
can name table accessors without erasing or weakening the lifetime
relationship.
This enables APIs such as the below instead of requiring closure-based
registration everywhere which greatly simplifies downstream crate code
and consumer code.
```diff
- .add_table::<PlayerPosition>(|reg, db| reg.bind(db.player_position()))
+ .add_table::<PlayerPositionTableAccessor>()
```
# API and ABI breaking changes
None.
This is additive and should not break existing generated bindings usage.
Existing code such as the below continues to work unchanged:
```rust
ctx.db.player_position().on_insert(...)
```
The new `TableAccessor` trait is exported from both the SDK root and
`__codegen`, and generated marker types are added alongside existing
generated table handles and access traits.
# Expected complexity level and risk
Complexity: **2/5**
The change is small and additive, but it touches Rust SDK codegen and
generated binding shape. The main risk is introducing generated code
that depends on the new SDK trait, so generated bindings and the SDK
version must match.
This does not alter table handle ownership, callback behavior, or
existing access methods.
# Testing
- [x] Ran `cargo check -p spacetimedb-sdk`.
- [x] Regenerated Rust bindings for my game.
- [x] Verified generated bindings include `*TableAccessor` marker types.
- [x] Used generated accessors from downstream local `bevy_stdb`.
- [x] Ran `cargo check -p bevy_stdb` against the local SDK.
---------
Signed-off-by: Jeff Rooks <onx2rj@gmail.com>
Co-authored-by: Phoebe Goldman <phoebe@goldman-tribe.org>
Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
# Description of Changes Makes `spacetimedb-dst` to `spacetimedb-dst-lib`. To be able to write tests for private repo, We have two options: 1. Write all DST code in private. 2. Make this a `lib` with test covering public specific code, and write a `bin` in private, I chose option 2 as it's easier to maintain tests like this, otherwise you may have to raise a separate PR for changes in `engine` crate, which will be painful. This also makes methods of `TestSuite` async. binary crate PR - clockworklabs/SpacetimeDBPrivate#3287 # API and ABI breaking changes NA # Expected complexity level and risk 1 # Testing Not applicable.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )