Skip to content

Commit fd40008

Browse files
committed
implement ids-no-names in c# sdk codegen
1 parent c093070 commit fd40008

File tree

2 files changed

+46
-48
lines changed

2 files changed

+46
-48
lines changed

crates/cli/src/subcommands/generate/csharp.rs

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::fmt::{self, Write};
55
use std::ops::Deref;
66

77
use convert_case::{Case, Casing};
8+
use itertools::Itertools;
89
use spacetimedb_lib::sats::{AlgebraicType, AlgebraicTypeRef, ArrayType, ProductType, SumType};
910
use spacetimedb_lib::ReducerDef;
1011
use spacetimedb_primitives::ColList;
@@ -505,7 +506,7 @@ fn autogen_csharp_access_funcs_for_struct(
505506
}
506507
}
507508

508-
pub fn autogen_csharp_reducer(ctx: &GenCtx, reducer: &ReducerDef, namespace: &str) -> String {
509+
pub fn autogen_csharp_reducer(ctx: &GenCtx, reducer_idx: usize, reducer: &ReducerDef, namespace: &str) -> String {
509510
let func_name = &*reducer.name;
510511
let func_name_pascal_case = func_name.to_case(Case::Pascal);
511512

@@ -515,7 +516,7 @@ pub fn autogen_csharp_reducer(ctx: &GenCtx, reducer: &ReducerDef, namespace: &st
515516
writeln!(output, "[SpacetimeDB.Type]");
516517
writeln!(output, "public partial class {func_name_pascal_case} : IReducerArgs");
517518
indented_block(&mut output, |output| {
518-
writeln!(output, "string IReducerArgs.ReducerName => \"{func_name}\";");
519+
writeln!(output, "uint IReducerArgs.ReducerIndex => {reducer_idx};");
519520
if !reducer.args.is_empty() {
520521
writeln!(output);
521522
}
@@ -542,13 +543,17 @@ pub fn autogen_csharp_reducer(ctx: &GenCtx, reducer: &ReducerDef, namespace: &st
542543
pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str) -> Vec<(String, String)> {
543544
let mut results = Vec::new();
544545

545-
let tables = items.iter().filter_map(|i| {
546-
if let GenItem::Table(table) = i {
547-
Some(table)
548-
} else {
549-
None
550-
}
551-
});
546+
let tables: Vec<_> = items
547+
.iter()
548+
.filter_map(|i| {
549+
if let GenItem::Table(table) = i {
550+
Some(table)
551+
} else {
552+
None
553+
}
554+
})
555+
.sorted_by_key(|t| &t.schema.table_name)
556+
.collect();
552557

553558
let reducers: Vec<&ReducerDef> = items
554559
.iter()
@@ -559,6 +564,7 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
559564
None
560565
}
561566
})
567+
.sorted_by_key(|i| &i.name)
562568
.collect();
563569
let reducer_names: Vec<String> = reducers
564570
.iter()
@@ -569,7 +575,7 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
569575

570576
writeln!(output, "public sealed class RemoteTables");
571577
indented_block(&mut output, |output| {
572-
for table in tables {
578+
for &table in &tables {
573579
let schema = &table.schema;
574580
let name = &schema.table_name;
575581
let csharp_name = name.as_ref().to_case(Case::Pascal);
@@ -766,8 +772,6 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
766772
writeln!(output, "{reducer_name} {reducer_name},");
767773
}
768774
writeln!(output, "Unit StdbNone,");
769-
writeln!(output, "Unit StdbIdentityConnected,");
770-
writeln!(output, "Unit StdbIdentityDisconnected");
771775
}
772776
writeln!(output, ")>;");
773777

@@ -787,43 +791,33 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
787791
writeln!(output, "Reducers = new(this, this.SetReducerFlags);");
788792
writeln!(output);
789793

790-
for item in items {
791-
if let GenItem::Table(table) = item {
792-
writeln!(
793-
output,
794-
"clientDB.AddTable<{table_type}>(\"{table_name}\", Db.{csharp_table_name});",
795-
table_type = csharp_typename(ctx, table.data),
796-
table_name = table.schema.table_name,
797-
csharp_table_name = table.schema.table_name.as_ref().to_case(Case::Pascal)
798-
);
799-
}
794+
for (table_idx, &table) in tables.iter().enumerate() {
795+
writeln!(
796+
output,
797+
"clientDB.AddTable<{table_type}>({table_idx}, Db.{csharp_table_name});",
798+
table_type = csharp_typename(ctx, table.data),
799+
csharp_table_name = table.schema.table_name.as_ref().to_case(Case::Pascal)
800+
);
800801
}
801802
});
802803
writeln!(output);
803804

804-
writeln!(output, "protected override Reducer ToReducer(TransactionUpdate update)");
805+
writeln!(
806+
output,
807+
"protected override Reducer ToReducer(uint reducerIdx, TransactionUpdate update)"
808+
);
805809
indented_block(output, |output| {
806810
writeln!(output, "var encodedArgs = update.ReducerCall.Args;");
807-
writeln!(output, "return update.ReducerCall.ReducerName switch {{");
811+
writeln!(output, "return reducerIdx switch {{");
808812
{
809813
indent_scope!(output);
810-
for (reducer, reducer_name) in std::iter::zip(&reducers, &reducer_names) {
811-
let reducer_str_name = &reducer.name;
814+
for (reducer_idx, reducer_name) in reducer_names.iter().enumerate() {
812815
writeln!(
813816
output,
814-
"\"{reducer_str_name}\" => new Reducer.{reducer_name}(BSATNHelpers.Decode<{reducer_name}>(encodedArgs)),"
817+
"{reducer_idx} => new Reducer.{reducer_name}(BSATNHelpers.Decode<{reducer_name}>(encodedArgs)),"
815818
);
816819
}
817-
writeln!(output, "\"<none>\" => new Reducer.StdbNone(default),");
818-
writeln!(
819-
output,
820-
"\"__identity_connected__\" => new Reducer.StdbIdentityConnected(default),"
821-
);
822-
writeln!(
823-
output,
824-
"\"__identity_disconnected__\" => new Reducer.StdbIdentityDisconnected(default),"
825-
);
826-
writeln!(output, "\"\" => new Reducer.StdbNone(default),"); //Transaction from CLI command
820+
writeln!(output, "4294967295 => new Reducer.StdbNone(default),");
827821
writeln!(
828822
output,
829823
r#"var reducer => throw new ArgumentOutOfRangeException("Reducer", $"Unknown reducer {{reducer}}")"#
@@ -855,9 +849,7 @@ pub fn autogen_csharp_globals(ctx: &GenCtx, items: &[GenItem], namespace: &str)
855849
"Reducer.{reducer_name}(var args) => Reducers.Invoke{reducer_name}(eventContext, args),"
856850
);
857851
}
858-
writeln!(output, "Reducer.StdbNone or");
859-
writeln!(output, "Reducer.StdbIdentityConnected or");
860-
writeln!(output, "Reducer.StdbIdentityDisconnected => true,");
852+
writeln!(output, "Reducer.StdbNone => true,");
861853
writeln!(
862854
output,
863855
r#"_ => throw new ArgumentOutOfRangeException("Reducer", $"Unknown reducer {{reducer}}")"#

crates/cli/src/subcommands/generate/mod.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,14 @@ pub fn generate(module: RawModuleDef, lang: Language, namespace: &str) -> anyhow
267267
let items = itertools::chain!(
268268
types,
269269
tables.into_iter().map(GenItem::Table),
270-
reducers
271-
.filter(|r| !(r.name.starts_with("__") && r.name.ends_with("__")))
272-
.map(GenItem::Reducer),
270+
reducers.map(GenItem::Reducer),
273271
);
274272

275273
let items: Vec<GenItem> = items.collect();
274+
let reducer_idx = &mut 0;
276275
let mut files: Vec<(String, String)> = items
277276
.iter()
278-
.filter_map(|item| item.generate(&ctx, lang, namespace))
277+
.filter_map(|item| item.generate(&ctx, reducer_idx, lang, namespace))
279278
.collect();
280279
files.extend(generate_globals(&ctx, lang, namespace, &items));
281280
files
@@ -340,15 +339,21 @@ fn generate_globals(ctx: &GenCtx, lang: Language, namespace: &str, items: &[GenI
340339
}
341340

342341
impl GenItem {
343-
fn generate(&self, ctx: &GenCtx, lang: Language, namespace: &str) -> Option<(String, String)> {
342+
fn generate(
343+
&self,
344+
ctx: &GenCtx,
345+
reducer_idx: &mut usize,
346+
lang: Language,
347+
namespace: &str,
348+
) -> Option<(String, String)> {
344349
match lang {
345-
Language::Csharp => self.generate_csharp(ctx, namespace),
350+
Language::Csharp => self.generate_csharp(ctx, reducer_idx, namespace),
346351
Language::TypeScript => unreachable!(),
347352
Language::Rust => unreachable!(),
348353
}
349354
}
350355

351-
fn generate_csharp(&self, ctx: &GenCtx, namespace: &str) -> Option<(String, String)> {
356+
fn generate_csharp(&self, ctx: &GenCtx, reducer_idx: &mut usize, namespace: &str) -> Option<(String, String)> {
352357
match self {
353358
GenItem::Table(table) => {
354359
let code = csharp::autogen_csharp_table(ctx, table, namespace);
@@ -367,7 +372,8 @@ impl GenItem {
367372
_ => todo!(),
368373
},
369374
GenItem::Reducer(reducer) => {
370-
let code = csharp::autogen_csharp_reducer(ctx, reducer, namespace);
375+
let code = csharp::autogen_csharp_reducer(ctx, *reducer_idx, reducer, namespace);
376+
*reducer_idx += 1;
371377
let pascalcase = reducer.name.deref().to_case(Case::Pascal);
372378
Some((pascalcase + "Reducer.cs", code))
373379
}

0 commit comments

Comments
 (0)