Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/bindings-sys/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,7 @@ pub mod raw {
/// would be where you would initialize the interepreter and load the user module into it.
fn __setup__() -> Result;
/// Required. Runs after `__setup__`; returns all the exports for the module.
fn __describe_module__() -> Encoded<ModuleDef>;
fn __describe_module_v10__() -> Encoded<ModuleDef>;
/// Required. id is an index into the `ModuleDef.reducers` returned from `__describe_module__`.
/// args is a bsatn-encoded product value defined by the schema at `reducers[id]`.
fn __call_reducer__(
Expand Down
28 changes: 18 additions & 10 deletions crates/bindings/src/rt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ use crate::query_builder::Query;
use crate::table::IndexAlgo;
use crate::{sys, AnonymousViewContext, IterBuf, ReducerContext, ReducerResult, SpacetimeType, Table, ViewContext};
use spacetimedb_lib::bsatn::EncodeError;
use spacetimedb_lib::db::raw_def::v10::RawModuleDefV10Builder;
pub use spacetimedb_lib::db::raw_def::v9::Lifecycle as LifecycleReducer;
use spacetimedb_lib::db::raw_def::v9::{RawIndexAlgorithm, RawModuleDefV9Builder, TableType, ViewResultHeader};
use spacetimedb_lib::db::raw_def::v9::{RawIndexAlgorithm, TableType, ViewResultHeader};
use spacetimedb_lib::de::{self, Deserialize, DeserializeOwned, Error as _, SeqProductAccess};
use spacetimedb_lib::sats::typespace::TypespaceBuilder;
use spacetimedb_lib::sats::{impl_deserialize, impl_serialize, ProductTypeElement};
Expand Down Expand Up @@ -677,7 +678,7 @@ pub trait RowLevelSecurityInfo {
}

/// A function which will be registered by [`register_describer`] into [`DESCRIBERS`],
/// which will be called by [`__describe_module__`] to construct a module definition.
/// which will be called by [`__describe_module_v10__`] to construct a module definition.
///
/// May be a closure over static data, so that e.g.
/// [`register_row_level_security`] doesn't need to take a type parameter.
Expand All @@ -703,6 +704,13 @@ pub fn register_reftype<T: SpacetimeType>() {
pub fn register_table<T: Table>() {
register_describer(|module| {
let product_type_ref = *T::Row::make_type(&mut module.inner).as_ref().unwrap();
if let Some(schedule) = T::SCHEDULE {
module.inner.add_schedule(
T::TABLE_NAME,
schedule.scheduled_at_column,
schedule.reducer_or_procedure_name,
);
}

let mut table = module
.inner
Expand All @@ -722,10 +730,6 @@ pub fn register_table<T: Table>() {
for &col in T::SEQUENCES {
table = table.with_column_sequence(col);
}
if let Some(schedule) = T::SCHEDULE {
table = table.with_schedule(schedule.reducer_or_procedure_name, schedule.scheduled_at_column);
}

for col in T::get_default_col_values().iter_mut() {
table = table.with_default_column_value(col.col_id, col.value.clone())
}
Expand All @@ -752,7 +756,11 @@ impl From<IndexAlgo<'_>> for RawIndexAlgorithm {
pub fn register_reducer<'a, A: Args<'a>, I: FnInfo<Invoke = ReducerFn>>(_: impl Reducer<'a, A>) {
register_describer(|module| {
let params = A::schema::<I>(&mut module.inner);
module.inner.add_reducer(I::NAME, params, I::LIFECYCLE);
if let Some(lifecycle) = I::LIFECYCLE {
module.inner.add_lifecycle_reducer(lifecycle, I::NAME, params);
} else {
module.inner.add_reducer(I::NAME, params);
}
module.reducers.push(I::INVOKE);
})
}
Expand Down Expand Up @@ -817,7 +825,7 @@ pub fn register_row_level_security(sql: &'static str) {
#[derive(Default)]
pub struct ModuleBuilder {
/// The module definition.
inner: RawModuleDefV9Builder,
inner: RawModuleDefV10Builder,
/// The reducers of the module.
reducers: Vec<ReducerFn>,
/// The procedures of the module.
Expand Down Expand Up @@ -866,7 +874,7 @@ static ANONYMOUS_VIEWS: OnceLock<Vec<AnonymousFn>> = OnceLock::new();
/// including when modules are updated (re-publishing).
/// After initialization, the module cannot alter the schema.
#[no_mangle]
extern "C" fn __describe_module__(description: BytesSink) {
extern "C" fn __describe_module_v10__(description: BytesSink) {
// Collect the `module`.
let mut module = ModuleBuilder::default();
for describer in &mut *DESCRIBERS.lock().unwrap() {
Expand All @@ -875,7 +883,7 @@ extern "C" fn __describe_module__(description: BytesSink) {

// Serialize the module to bsatn.
let module_def = module.inner.finish();
let module_def = RawModuleDef::V9(module_def);
let module_def = RawModuleDef::V10(module_def);
let bytes = bsatn::to_vec(&module_def).expect("unable to serialize typespace");

// Write the sets of reducers, procedures and views.
Expand Down
130 changes: 0 additions & 130 deletions crates/codegen/tests/snapshots/codegen__codegen_csharp.snap
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: crates/codegen/tests/codegen.rs
assertion_line: 37
expression: outfiles
---
"Procedures/GetMySchemaViaHttp.g.cs" = '''
Expand Down Expand Up @@ -570,56 +569,6 @@ namespace SpacetimeDB
}
}
'''
"Reducers/ClientConnected.g.cs" = '''
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.

#nullable enable

using System;
using SpacetimeDB.ClientApi;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace SpacetimeDB
{
public sealed partial class RemoteReducers : RemoteBase
{
public delegate void ClientConnectedHandler(ReducerEventContext ctx);
public event ClientConnectedHandler? OnClientConnected;

public bool InvokeClientConnected(ReducerEventContext ctx, Reducer.ClientConnected args)
{
if (OnClientConnected == null)
{
if (InternalOnUnhandledReducerError != null)
{
switch(ctx.Event.Status)
{
case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break;
case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break;
}
}
return false;
}
OnClientConnected(
ctx
);
return true;
}
}

public abstract partial class Reducer
{
[SpacetimeDB.Type]
[DataContract]
public sealed partial class ClientConnected : Reducer, IReducerArgs
{
string IReducerArgs.ReducerName => "client_connected";
}
}
}
'''
"Reducers/DeletePlayer.g.cs" = '''
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
Expand Down Expand Up @@ -965,81 +914,6 @@ namespace SpacetimeDB
}
}
'''
"Reducers/RepeatingTest.g.cs" = '''
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.

#nullable enable

using System;
using SpacetimeDB.ClientApi;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace SpacetimeDB
{
public sealed partial class RemoteReducers : RemoteBase
{
public delegate void RepeatingTestHandler(ReducerEventContext ctx, SpacetimeDB.RepeatingTestArg arg);
public event RepeatingTestHandler? OnRepeatingTest;

public void RepeatingTest(SpacetimeDB.RepeatingTestArg arg)
{
conn.InternalCallReducer(new Reducer.RepeatingTest(arg), this.SetCallReducerFlags.RepeatingTestFlags);
}

public bool InvokeRepeatingTest(ReducerEventContext ctx, Reducer.RepeatingTest args)
{
if (OnRepeatingTest == null)
{
if (InternalOnUnhandledReducerError != null)
{
switch(ctx.Event.Status)
{
case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break;
case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break;
}
}
return false;
}
OnRepeatingTest(
ctx,
args.Arg
);
return true;
}
}

public abstract partial class Reducer
{
[SpacetimeDB.Type]
[DataContract]
public sealed partial class RepeatingTest : Reducer, IReducerArgs
{
[DataMember(Name = "arg")]
public RepeatingTestArg Arg;

public RepeatingTest(RepeatingTestArg Arg)
{
this.Arg = Arg;
}

public RepeatingTest()
{
this.Arg = new();
}

string IReducerArgs.ReducerName => "repeating_test";
}
}

public sealed partial class SetReducerFlags
{
internal CallReducerFlags RepeatingTestFlags;
public void RepeatingTest(CallReducerFlags flags) => RepeatingTestFlags = flags;
}
}
'''
"Reducers/SayHello.g.cs" = '''
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
Expand Down Expand Up @@ -1923,13 +1797,11 @@ namespace SpacetimeDB
"add_player" => BSATNHelpers.Decode<Reducer.AddPlayer>(encodedArgs),
"add_private" => BSATNHelpers.Decode<Reducer.AddPrivate>(encodedArgs),
"assert_caller_identity_is_module_identity" => BSATNHelpers.Decode<Reducer.AssertCallerIdentityIsModuleIdentity>(encodedArgs),
"client_connected" => BSATNHelpers.Decode<Reducer.ClientConnected>(encodedArgs),
"delete_player" => BSATNHelpers.Decode<Reducer.DeletePlayer>(encodedArgs),
"delete_players_by_name" => BSATNHelpers.Decode<Reducer.DeletePlayersByName>(encodedArgs),
"list_over_age" => BSATNHelpers.Decode<Reducer.ListOverAge>(encodedArgs),
"log_module_identity" => BSATNHelpers.Decode<Reducer.LogModuleIdentity>(encodedArgs),
"query_private" => BSATNHelpers.Decode<Reducer.QueryPrivate>(encodedArgs),
"repeating_test" => BSATNHelpers.Decode<Reducer.RepeatingTest>(encodedArgs),
"say_hello" => BSATNHelpers.Decode<Reducer.SayHello>(encodedArgs),
"test" => BSATNHelpers.Decode<Reducer.Test>(encodedArgs),
"test_btree_index_args" => BSATNHelpers.Decode<Reducer.TestBtreeIndexArgs>(encodedArgs),
Expand Down Expand Up @@ -1961,13 +1833,11 @@ namespace SpacetimeDB
Reducer.AddPlayer args => Reducers.InvokeAddPlayer(eventContext, args),
Reducer.AddPrivate args => Reducers.InvokeAddPrivate(eventContext, args),
Reducer.AssertCallerIdentityIsModuleIdentity args => Reducers.InvokeAssertCallerIdentityIsModuleIdentity(eventContext, args),
Reducer.ClientConnected args => Reducers.InvokeClientConnected(eventContext, args),
Reducer.DeletePlayer args => Reducers.InvokeDeletePlayer(eventContext, args),
Reducer.DeletePlayersByName args => Reducers.InvokeDeletePlayersByName(eventContext, args),
Reducer.ListOverAge args => Reducers.InvokeListOverAge(eventContext, args),
Reducer.LogModuleIdentity args => Reducers.InvokeLogModuleIdentity(eventContext, args),
Reducer.QueryPrivate args => Reducers.InvokeQueryPrivate(eventContext, args),
Reducer.RepeatingTest args => Reducers.InvokeRepeatingTest(eventContext, args),
Reducer.SayHello args => Reducers.InvokeSayHello(eventContext, args),
Reducer.Test args => Reducers.InvokeTest(eventContext, args),
Reducer.TestBtreeIndexArgs args => Reducers.InvokeTestBtreeIndexArgs(eventContext, args),
Expand Down
Loading
Loading