Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
350 changes: 331 additions & 19 deletions crates/codegen/src/csharp.rs

Large diffs are not rendered by default.

279 changes: 272 additions & 7 deletions crates/codegen/tests/snapshots/codegen__codegen_csharp.snap
Original file line number Diff line number Diff line change
@@ -1,9 +1,151 @@
---
source: crates/codegen/tests/codegen.rs
assertion_line: 37
expression: outfiles
---
"Procedures/ReturnValue.g.cs" = ''
"Procedures/SleepOneSecond.g.cs" = ''
"Procedures/ReturnValue.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 RemoteProcedures : RemoteBase
{
public void ReturnValue(ulong foo, ProcedureCallback<SpacetimeDB.Baz> callback)
{
// Convert the clean callback to the wrapper callback
InternalReturnValue(foo, (ctx, result) => {
if (result.IsSuccess && result.Value != null)
{
callback(ctx, ProcedureCallbackResult<SpacetimeDB.Baz>.Success(result.Value.Value));
}
else
{
callback(ctx, ProcedureCallbackResult<SpacetimeDB.Baz>.Failure(result.Error!));
}
});
}

private void InternalReturnValue(ulong foo, ProcedureCallback<Procedure.ReturnValue> callback)
{
conn.InternalCallProcedure(new Procedure.ReturnValueArgs(foo), callback);
}

}

public abstract partial class Procedure
{
[SpacetimeDB.Type]
[DataContract]
public sealed partial class ReturnValue
{
[DataMember(Name = "Value")]
public SpacetimeDB.Baz Value;

public ReturnValue(SpacetimeDB.Baz Value)
{
this.Value = Value;
}

public ReturnValue()
{
this.Value = new();
}
}
[SpacetimeDB.Type]
[DataContract]
public sealed partial class ReturnValueArgs : Procedure, IProcedureArgs
{
[DataMember(Name = "foo")]
public ulong Foo;

public ReturnValueArgs(ulong Foo)
{
this.Foo = Foo;
}

public ReturnValueArgs()
{
}

string IProcedureArgs.ProcedureName => "return_value";
}

}
}
'''
"Procedures/SleepOneSecond.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 RemoteProcedures : RemoteBase
{
public void SleepOneSecond(ProcedureCallback<SpacetimeDB.Unit> callback)
{
// Convert the clean callback to the wrapper callback
InternalSleepOneSecond((ctx, result) => {
if (result.IsSuccess && result.Value != null)
{
callback(ctx, ProcedureCallbackResult<SpacetimeDB.Unit>.Success(result.Value.Value));
}
else
{
callback(ctx, ProcedureCallbackResult<SpacetimeDB.Unit>.Failure(result.Error!));
}
});
}

private void InternalSleepOneSecond(ProcedureCallback<Procedure.SleepOneSecond> callback)
{
conn.InternalCallProcedure(new Procedure.SleepOneSecondArgs(), callback);
}

}

public abstract partial class Procedure
{
[SpacetimeDB.Type]
[DataContract]
public sealed partial class SleepOneSecond
{
[DataMember(Name = "Value")]
public SpacetimeDB.Unit Value;

public SleepOneSecond(SpacetimeDB.Unit Value)
{
this.Value = Value;
}

public SleepOneSecond()
{
}
}
[SpacetimeDB.Type]
[DataContract]
public sealed partial class SleepOneSecondArgs : Procedure, IProcedureArgs
{
string IProcedureArgs.ProcedureName => "sleep_one_second";
}

}
}
'''
"Reducers/Add.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 @@ -707,10 +849,10 @@ namespace SpacetimeDB
{
public sealed partial class RemoteReducers : RemoteBase
{
public delegate void RepeatingTestHandler(ReducerEventContext ctx, RepeatingTestArg arg);
public delegate void RepeatingTestHandler(ReducerEventContext ctx, SpacetimeDB.RepeatingTestArg arg);
public event RepeatingTestHandler? OnRepeatingTest;

public void RepeatingTest(RepeatingTestArg arg)
public void RepeatingTest(SpacetimeDB.RepeatingTestArg arg)
{
conn.InternalCallReducer(new Reducer.RepeatingTest(arg), this.SetCallReducerFlags.RepeatingTestFlags);
}
Expand Down Expand Up @@ -843,10 +985,10 @@ namespace SpacetimeDB
{
public sealed partial class RemoteReducers : RemoteBase
{
public delegate void TestHandler(ReducerEventContext ctx, TestA arg, TestB arg2, NamespaceTestC arg3, NamespaceTestF arg4);
public delegate void TestHandler(ReducerEventContext ctx, SpacetimeDB.TestA arg, SpacetimeDB.TestB arg2, SpacetimeDB.NamespaceTestC arg3, SpacetimeDB.NamespaceTestF arg4);
public event TestHandler? OnTest;

public void Test(TestA arg, TestB arg2, NamespaceTestC arg3, NamespaceTestF arg4)
public void Test(SpacetimeDB.TestA arg, SpacetimeDB.TestB arg2, SpacetimeDB.NamespaceTestC arg3, SpacetimeDB.NamespaceTestF arg4)
{
conn.InternalCallReducer(new Reducer.Test(arg, arg2, arg3, arg4), this.SetCallReducerFlags.TestFlags);
}
Expand Down Expand Up @@ -1005,6 +1147,11 @@ namespace SpacetimeDB
internal event Action<ReducerEventContext, Exception>? InternalOnUnhandledReducerError;
}

public sealed partial class RemoteProcedures : RemoteBase
{
internal RemoteProcedures(DbConnection conn) : base(conn) { }
}

public sealed partial class RemoteTables : RemoteTablesBase
{
public RemoteTables(DbConnection conn)
Expand All @@ -1026,7 +1173,7 @@ namespace SpacetimeDB

public sealed partial class SetReducerFlags { }

public interface IRemoteDbContext : IDbContext<RemoteTables, RemoteReducers, SetReducerFlags, SubscriptionBuilder> {
public interface IRemoteDbContext : IDbContext<RemoteTables, RemoteReducers, SetReducerFlags, SubscriptionBuilder, RemoteProcedures> {
public event Action<ReducerEventContext, Exception>? OnUnhandledReducerError;
}

Expand Down Expand Up @@ -1061,6 +1208,13 @@ namespace SpacetimeDB
/// </summary>
public SetReducerFlags SetReducerFlags => conn.SetReducerFlags;
/// <summary>
/// Access to procedures defined by the module.
///
/// The returned <c>RemoteProcedures</c> will have a method to invoke each procedure defined by the module,
/// with a callback for when the procedure completes and returns a value.
/// </summary>
public RemoteProcedures Procedures => conn.Procedures;
/// <summary>
/// Returns <c>true</c> if the connection is active, i.e. has not yet disconnected.
/// </summary>
public bool IsActive => conn.IsActive;
Expand Down Expand Up @@ -1134,6 +1288,13 @@ namespace SpacetimeDB
/// </summary>
public SetReducerFlags SetReducerFlags => conn.SetReducerFlags;
/// <summary>
/// Access to procedures defined by the module.
///
/// The returned <c>RemoteProcedures</c> will have a method to invoke each procedure defined by the module,
/// with a callback for when the procedure completes and returns a value.
/// </summary>
public RemoteProcedures Procedures => conn.Procedures;
/// <summary>
/// Returns <c>true</c> if the connection is active, i.e. has not yet disconnected.
/// </summary>
public bool IsActive => conn.IsActive;
Expand Down Expand Up @@ -1212,6 +1373,13 @@ namespace SpacetimeDB
/// </summary>
public SetReducerFlags SetReducerFlags => conn.SetReducerFlags;
/// <summary>
/// Access to procedures defined by the module.
///
/// The returned <c>RemoteProcedures</c> will have a method to invoke each procedure defined by the module,
/// with a callback for when the procedure completes and returns a value.
/// </summary>
public RemoteProcedures Procedures => conn.Procedures;
/// <summary>
/// Returns <c>true</c> if the connection is active, i.e. has not yet disconnected.
/// </summary>
public bool IsActive => conn.IsActive;
Expand Down Expand Up @@ -1281,6 +1449,13 @@ namespace SpacetimeDB
/// </summary>
public SetReducerFlags SetReducerFlags => conn.SetReducerFlags;
/// <summary>
/// Access to procedures defined by the module.
///
/// The returned <c>RemoteProcedures</c> will have a method to invoke each procedure defined by the module,
/// with a callback for when the procedure completes and returns a value.
/// </summary>
public RemoteProcedures Procedures => conn.Procedures;
/// <summary>
/// Returns <c>true</c> if the connection is active, i.e. has not yet disconnected.
/// </summary>
public bool IsActive => conn.IsActive;
Expand Down Expand Up @@ -1323,6 +1498,86 @@ namespace SpacetimeDB
}
}

public sealed class ProcedureEventContext : IProcedureEventContext, IRemoteDbContext
{
private readonly DbConnection conn;
/// <summary>
/// The procedure event that caused this callback to run.
/// </summary>
public readonly ProcedureEvent Event;

/// <summary>
/// Access to tables in the client cache, which stores a read-only replica of the remote database state.
///
/// The returned <c>DbView</c> will have a method to access each table defined by the module.
/// </summary>
public RemoteTables Db => conn.Db;
/// <summary>
/// Access to reducers defined by the module.
///
/// The returned <c>RemoteReducers</c> will have a method to invoke each reducer defined by the module,
/// plus methods for adding and removing callbacks on each of those reducers.
/// </summary>
public RemoteReducers Reducers => conn.Reducers;
/// <summary>
/// Access to setters for per-reducer flags.
///
/// The returned <c>SetReducerFlags</c> will have a method to invoke,
/// for each reducer defined by the module,
/// which call-flags for the reducer can be set.
/// </summary>
public SetReducerFlags SetReducerFlags => conn.SetReducerFlags;
/// <summary>
/// Access to procedures defined by the module.
///
/// The returned <c>RemoteProcedures</c> will have a method to invoke each procedure defined by the module,
/// with a callback for when the procedure completes and returns a value.
/// </summary>
public RemoteProcedures Procedures => conn.Procedures;
/// <summary>
/// Returns <c>true</c> if the connection is active, i.e. has not yet disconnected.
/// </summary>
public bool IsActive => conn.IsActive;
/// <summary>
/// Close the connection.
///
/// Throws an error if the connection is already closed.
/// </summary>
public void Disconnect() {
conn.Disconnect();
}
/// <summary>
/// Start building a subscription.
/// </summary>
/// <returns>A builder-pattern constructor for subscribing to queries,
/// causing matching rows to be replicated into the client cache.</returns>
public SubscriptionBuilder SubscriptionBuilder() => conn.SubscriptionBuilder();
/// <summary>
/// Get the <c>Identity</c> of this connection.
///
/// This method returns null if the connection was constructed anonymously
/// and we have not yet received our newly-generated <c>Identity</c> from the host.
/// </summary>
public Identity? Identity => conn.Identity;
/// <summary>
/// Get this connection's <c>ConnectionId</c>.
/// </summary>
public ConnectionId ConnectionId => conn.ConnectionId;
/// <summary>
/// Register a callback to be called when a reducer with no handler returns an error.
/// </summary>
public event Action<ReducerEventContext, Exception>? OnUnhandledReducerError {
add => Reducers.InternalOnUnhandledReducerError += value;
remove => Reducers.InternalOnUnhandledReducerError -= value;
}

internal ProcedureEventContext(DbConnection conn, ProcedureEvent Event)
{
this.conn = conn;
this.Event = Event;
}
}

/// <summary>
/// Builder-pattern constructor for subscription queries.
/// </summary>
Expand Down Expand Up @@ -1435,16 +1690,23 @@ namespace SpacetimeDB
private Reducer() { }
}

public abstract partial class Procedure
{
private Procedure() { }
}

public sealed class DbConnection : DbConnectionBase<DbConnection, RemoteTables, Reducer>
{
public override RemoteTables Db { get; }
public readonly RemoteReducers Reducers;
public readonly SetReducerFlags SetReducerFlags = new();
public readonly RemoteProcedures Procedures;

public DbConnection()
{
Db = new(this);
Reducers = new(this, SetReducerFlags);
Procedures = new(this);
}

protected override Reducer ToReducer(TransactionUpdate update)
Expand Down Expand Up @@ -1482,6 +1744,9 @@ namespace SpacetimeDB
protected override IErrorContext ToErrorContext(Exception exception) =>
new ErrorContext(this, exception);

protected override IProcedureEventContext ToProcedureEventContext(ProcedureEvent procedureEvent) =>
new ProcedureEventContext(this, procedureEvent);

protected override bool Dispatch(IReducerEventContext context, Reducer reducer)
{
var eventContext = (ReducerEventContext)context;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading