Skip to content

Commit

Permalink
support SetReducerFlags in C# codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
Centril committed Oct 15, 2024
1 parent b51292b commit d09d4b6
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 10 deletions.
26 changes: 24 additions & 2 deletions crates/cli/src/subcommands/generate/csharp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ fn ty_fmt<'a>(ctx: &'a GenCtx, ty: &'a AlgebraicType, namespace: &'a str) -> imp
}
// Arbitrary product types should fail.
AlgebraicType::Product(_) => unimplemented!(),
ty if ty.is_bytes() => f.write_str("byte[]"),
AlgebraicType::Array(ArrayType { elem_ty }) => {
write!(
f,
Expand Down Expand Up @@ -104,6 +105,7 @@ fn default_init(ctx: &GenCtx, ty: &AlgebraicType) -> Option<&'static str> {
AlgebraicType::Sum(sum_type) if sum_type.is_option() || sum_type.is_simple_enum() => None,
// TODO: generate some proper default here (what would it be for tagged enums?).
AlgebraicType::Sum(_) => Some("null!"),
ty if ty.is_bytes() => Some("Array.Empty<byte>()"),
// For product types, arrays, and maps, we can use the default constructor.
AlgebraicType::Product(_) | AlgebraicType::Array(_) | AlgebraicType::Map(_) => Some("new()"),
// Strings must have explicit default value of "".
Expand Down Expand Up @@ -656,7 +658,11 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)

writeln!(output, "public sealed class RemoteReducers : RemoteBase<DbConnection>");
indented_block(&mut output, |output| {
writeln!(output, "internal RemoteReducers(DbConnection conn) : base(conn) {{}}");
writeln!(
output,
"internal RemoteReducers(DbConnection conn) : base(conn) {{ this.SetReducerFlags = SetReducerFlags; }}"
);
writeln!(output, "internal readonly SetReducerFlags SetCallReducerFlags;");

for reducer in &reducers {
let func_name = &*reducer.name;
Expand Down Expand Up @@ -698,7 +704,7 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
indented_block(output, |output| {
writeln!(
output,
"conn.InternalCallReducer(new {func_name_pascal_case} {{ {field_inits} }});"
"conn.InternalCallReducer(new {func_name_pascal_case} {{ {field_inits} }}, this.SetCallReducerFlags.{func_name_pascal_case}Flags);"
);
});
writeln!(output);
Expand Down Expand Up @@ -731,12 +737,25 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
});
writeln!(output);

writeln!(output, "public sealed class SetReducerFlags");
indented_block(&mut output, |output| {
writeln!(output, "internal SetReducerFlags() {{ }}");
for reducer in &reducers {
let func_name = &*reducer.name;
let func_name_pascal_case = func_name.to_case(Case::Pascal);
writeln!(output, "internal CallReducerFlags {func_name_pascal_case}Flags;");
writeln!(output, "public void {func_name_pascal_case}(CallReducerFlags flags) {{ this.{func_name_pascal_case}Flags = flags; }}");
}
});
writeln!(output);

writeln!(
output,
"public partial record EventContext : DbContext<RemoteTables>, IEventContext"
);
indented_block(&mut output, |output| {
writeln!(output, "public readonly RemoteReducers Reducers;");
writeln!(output, "public readonly SetReducerFlags SetReducerFlags;");
writeln!(output, "public readonly Event<Reducer> Event;");
writeln!(output);
writeln!(
Expand All @@ -745,6 +764,7 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
);
indented_block(output, |output| {
writeln!(output, "Reducers = conn.Reducers;");
writeln!(output, "SetReducerFlags = conn.SetReducerFlags;");
writeln!(output, "Event = reducerEvent;");
});
});
Expand All @@ -770,11 +790,13 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
indented_block(&mut output, |output| {
writeln!(output, "public readonly RemoteTables Db = new();");
writeln!(output, "public readonly RemoteReducers Reducers;");
writeln!(output, "public readonly SetReducerFlags SetReducerFlags;");
writeln!(output);

writeln!(output, "public DbConnection()");
indented_block(output, |output| {
writeln!(output, "Reducers = new(this);");
writeln!(output, "SetReducerFlags = new();");
writeln!(output);

for item in items {
Expand Down
40 changes: 32 additions & 8 deletions crates/cli/tests/snapshots/codegen__codegen_csharp.snap
Original file line number Diff line number Diff line change
Expand Up @@ -862,13 +862,14 @@ namespace SpacetimeDB

public sealed class RemoteReducers : RemoteBase<DbConnection>
{
internal RemoteReducers(DbConnection conn) : base(conn) {}
internal RemoteReducers(DbConnection conn) : base(conn) { this.SetReducerFlags = SetReducerFlags; }
internal readonly SetReducerFlags SetCallReducerFlags;
public delegate void AddPlayerHandler(EventContext ctx, string name);
public event AddPlayerHandler? OnAddPlayer;

public void AddPlayer(string name)
{
conn.InternalCallReducer(new AddPlayer { Name = name });
conn.InternalCallReducer(new AddPlayer { Name = name }, this.SetCallReducerFlags.AddPlayerFlags);
}

public bool InvokeAddPlayer(EventContext ctx, AddPlayer args)
Expand All @@ -885,7 +886,7 @@ namespace SpacetimeDB

public void AddPrivate(string name)
{
conn.InternalCallReducer(new AddPrivate { Name = name });
conn.InternalCallReducer(new AddPrivate { Name = name }, this.SetCallReducerFlags.AddPrivateFlags);
}

public bool InvokeAddPrivate(EventContext ctx, AddPrivate args)
Expand All @@ -902,7 +903,7 @@ namespace SpacetimeDB

public void DeletePlayer(ulong id)
{
conn.InternalCallReducer(new DeletePlayer { Id = id });
conn.InternalCallReducer(new DeletePlayer { Id = id }, this.SetCallReducerFlags.DeletePlayerFlags);
}

public bool InvokeDeletePlayer(EventContext ctx, DeletePlayer args)
Expand All @@ -919,7 +920,7 @@ namespace SpacetimeDB

public void DeletePlayersByName(string name)
{
conn.InternalCallReducer(new DeletePlayersByName { Name = name });
conn.InternalCallReducer(new DeletePlayersByName { Name = name }, this.SetCallReducerFlags.DeletePlayersByNameFlags);
}

public bool InvokeDeletePlayersByName(EventContext ctx, DeletePlayersByName args)
Expand All @@ -936,7 +937,7 @@ namespace SpacetimeDB

public void QueryPrivate()
{
conn.InternalCallReducer(new QueryPrivate { });
conn.InternalCallReducer(new QueryPrivate { }, this.SetCallReducerFlags.QueryPrivateFlags);
}

public bool InvokeQueryPrivate(EventContext ctx, QueryPrivate args)
Expand All @@ -952,7 +953,7 @@ namespace SpacetimeDB

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

public bool InvokeRepeatingTest(EventContext ctx, RepeatingTest args)
Expand All @@ -969,7 +970,7 @@ namespace SpacetimeDB

public void Test(SpacetimeDB.TestA arg, SpacetimeDB.TestB arg2, SpacetimeDB.Namespace.Types.TestC arg3, SpacetimeDB.Namespace.TestF arg4)
{
conn.InternalCallReducer(new Test { Arg = arg, Arg2 = arg2, Arg3 = arg3, Arg4 = arg4 });
conn.InternalCallReducer(new Test { Arg = arg, Arg2 = arg2, Arg3 = arg3, Arg4 = arg4 }, this.SetCallReducerFlags.TestFlags);
}

public bool InvokeTest(EventContext ctx, Test args)
Expand All @@ -986,14 +987,35 @@ namespace SpacetimeDB
}
}

public sealed class SetReducerFlags
{
internal SetReducerFlags() { }
internal CallReducerFlags AddPlayerFlags;
public void AddPlayer(CallReducerFlags flags) { this.AddPlayerFlags = flags; }
internal CallReducerFlags AddPrivateFlags;
public void AddPrivate(CallReducerFlags flags) { this.AddPrivateFlags = flags; }
internal CallReducerFlags DeletePlayerFlags;
public void DeletePlayer(CallReducerFlags flags) { this.DeletePlayerFlags = flags; }
internal CallReducerFlags DeletePlayersByNameFlags;
public void DeletePlayersByName(CallReducerFlags flags) { this.DeletePlayersByNameFlags = flags; }
internal CallReducerFlags QueryPrivateFlags;
public void QueryPrivate(CallReducerFlags flags) { this.QueryPrivateFlags = flags; }
internal CallReducerFlags RepeatingTestFlags;
public void RepeatingTest(CallReducerFlags flags) { this.RepeatingTestFlags = flags; }
internal CallReducerFlags TestFlags;
public void Test(CallReducerFlags flags) { this.TestFlags = flags; }
}

public partial record EventContext : DbContext<RemoteTables>, IEventContext
{
public readonly RemoteReducers Reducers;
public readonly SetReducerFlags SetReducerFlags;
public readonly Event<Reducer> Event;

internal EventContext(DbConnection conn, Event<Reducer> reducerEvent) : base(conn.Db)
{
Reducers = conn.Reducers;
SetReducerFlags = conn.SetReducerFlags;
Event = reducerEvent;
}
}
Expand All @@ -1015,10 +1037,12 @@ namespace SpacetimeDB
{
public readonly RemoteTables Db = new();
public readonly RemoteReducers Reducers;
public readonly SetReducerFlags SetReducerFlags;

public DbConnection()
{
Reducers = new(this);
SetReducerFlags = new();

clientDB.AddTable<HasSpecialStuff>("has_special_stuff", Db.HasSpecialStuff);
clientDB.AddTable<PkMultiIdentity>("pk_multi_identity", Db.PkMultiIdentity);
Expand Down

0 comments on commit d09d4b6

Please sign in to comment.