@@ -535,12 +535,32 @@ fn print_table_filter_methods(
535535 )
536536}
537537
538+ fn reducer_type_name ( reducer : & ReducerDef ) -> String {
539+ let mut name = reducer. name . to_case ( Case :: Pascal ) ;
540+ name. push_str ( "Args" ) ;
541+ name
542+ }
543+
544+ fn reducer_variant_name ( reducer : & ReducerDef ) -> String {
545+ reducer. name . to_case ( Case :: Pascal )
546+ }
547+
548+ fn reducer_module_name ( reducer : & ReducerDef ) -> String {
549+ let mut name = reducer. name . to_case ( Case :: Snake ) ;
550+ name. push_str ( "_reducer" ) ;
551+ name
552+ }
553+
554+ fn reducer_function_name ( reducer : & ReducerDef ) -> String {
555+ reducer. name . to_case ( Case :: Snake )
556+ }
557+
538558/// Generate a file which defines a struct corresponding to the `reducer`'s arguments,
539559/// implements `spacetimedb_sdk::table::Reducer` for it, and defines a helper
540560/// function which invokes the reducer.
541561pub fn autogen_rust_reducer ( ctx : & GenCtx , reducer : & ReducerDef ) -> String {
542- let func_name = reducer . name . to_case ( Case :: Snake ) ;
543- let type_name = reducer . name . to_case ( Case :: Pascal ) ;
562+ let func_name = reducer_function_name ( reducer ) ;
563+ let type_name = reducer_type_name ( reducer ) ;
544564
545565 let mut output = CodeIndenter :: new ( String :: new ( ) ) ;
546566 let out = & mut output;
@@ -610,9 +630,9 @@ pub fn autogen_rust_reducer(ctx: &GenCtx, reducer: &ReducerDef) -> String {
610630///
611631/// The `mod.rs` contains several things:
612632///
613- /// 1. `pub mod` declarations for all the other files generated. Without these, either the
614- /// other files wouldn't get compiled, or users would have to `mod`-declare each file
615- /// manually.
633+ /// 1. `pub mod` and `pub use` declarations for all the other files generated.
634+ /// Without these, either the other files wouldn't get compiled,
635+ /// or users would have to `mod`-declare each file manually.
616636///
617637/// 2. `enum ReducerEvent`, which has variants for each reducer in the module.
618638/// Row callbacks are passed an optional `ReducerEvent` as an additional argument,
@@ -659,6 +679,11 @@ pub fn autogen_rust_globals(ctx: &GenCtx, items: &[GenItem]) -> Vec<(String, Str
659679
660680 out. newline ( ) ;
661681
682+ // Re-export all the modules for the generated files.
683+ print_module_reexports ( out, items) ;
684+
685+ out. newline ( ) ;
686+
662687 // Define `enum ReducerEvent`.
663688 print_reducer_event_defn ( out, items) ;
664689
@@ -723,21 +748,25 @@ fn iter_table_items(items: &[GenItem]) -> impl Iterator<Item = &TableDef> {
723748 } )
724749}
725750
751+ fn iter_module_names ( items : & [ GenItem ] ) -> impl Iterator < Item = String > + ' _ {
752+ items. iter ( ) . filter_map ( |item| match item {
753+ GenItem :: Table ( table) => Some ( table. name . to_case ( Case :: Snake ) ) ,
754+ GenItem :: TypeAlias ( ty) => Some ( ty. name . to_case ( Case :: Snake ) ) ,
755+ GenItem :: Reducer ( reducer) => ( !is_init ( reducer) ) . then_some ( reducer_module_name ( reducer) ) ,
756+ } )
757+ }
758+
726759/// Print `pub mod` declarations for all the files that will be generated for `items`.
727760fn print_module_decls ( out : & mut Indenter , items : & [ GenItem ] ) {
728- for item in items {
729- let ( name, suffix) = match item {
730- GenItem :: Table ( table) => ( & table. name , "" ) ,
731- GenItem :: TypeAlias ( ty) => ( & ty. name , "" ) ,
732- GenItem :: Reducer ( reducer) => {
733- if is_init ( reducer) {
734- continue ;
735- }
736- ( & reducer. name , "_reducer" )
737- }
738- } ;
739- let module_name = name. to_case ( Case :: Snake ) ;
740- writeln ! ( out, "pub mod {}{};" , module_name, suffix) . unwrap ( ) ;
761+ for module_name in iter_module_names ( items) {
762+ writeln ! ( out, "pub mod {};" , module_name) . unwrap ( ) ;
763+ }
764+ }
765+
766+ /// Print `pub use *` declarations for all the files that will be generated for `items`.
767+ fn print_module_reexports ( out : & mut Indenter , items : & [ GenItem ] ) {
768+ for module_name in iter_module_names ( items) {
769+ writeln ! ( out, "pub use {}::*;" , module_name) . unwrap ( ) ;
741770 }
742771}
743772
@@ -856,14 +885,13 @@ fn print_handle_event_defn(out: &mut Indenter, items: &[GenItem]) {
856885 "match &function_call.reducer[..] {" ,
857886 |out| {
858887 for reducer in iter_reducer_items ( items) {
859- let type_or_variant_name = reducer. name . to_case ( Case :: Pascal ) ;
860888 writeln ! (
861889 out,
862- "{:?} => reducer_callbacks.handle_event_of_type::<{}_reducer ::{}, ReducerEvent>(event, state, ReducerEvent::{})," ,
890+ "{:?} => reducer_callbacks.handle_event_of_type::<{}::{}, ReducerEvent>(event, state, ReducerEvent::{})," ,
863891 reducer. name,
864- reducer . name . to_case ( Case :: Snake ) ,
865- type_or_variant_name ,
866- type_or_variant_name ,
892+ reducer_module_name ( reducer ) ,
893+ reducer_type_name ( reducer ) ,
894+ reducer_variant_name ( reducer ) ,
867895 ) . unwrap ( ) ;
868896 }
869897 writeln ! (
@@ -925,13 +953,12 @@ fn print_reducer_event_defn(out: &mut Indenter, items: &[GenItem]) {
925953 for item in items {
926954 if let GenItem :: Reducer ( reducer) = item {
927955 if !is_init ( reducer) {
928- let type_name = reducer. name . to_case ( Case :: Pascal ) ;
929956 writeln ! (
930957 out,
931- "{}({}_reducer ::{})," ,
932- type_name ,
933- reducer . name . to_case ( Case :: Snake ) ,
934- type_name ,
958+ "{}({}::{})," ,
959+ reducer_variant_name ( reducer ) ,
960+ reducer_module_name ( reducer ) ,
961+ reducer_type_name ( reducer ) ,
935962 )
936963 . unwrap ( ) ;
937964 }
0 commit comments