MCPcopy Create free account
hub / github.com/clockworklabs/SpacetimeDB / generate_reducer_file

Method generate_reducer_file

crates/codegen/src/unrealcpp.rs:424–620  ·  view source on GitHub ↗
(&self, module: &ModuleDef, reducer: &ReducerDef)

Source from the content-addressed store, hash-verified

422 }
423
424 fn generate_reducer_file(&self, module: &ModuleDef, reducer: &ReducerDef) -> OutputFile {
425 let module_prefix = self.module_prefix;
426 let reducer_pascal = reducer.name.deref().to_case(Case::Pascal);
427 let pascal = format!("{module_prefix}{reducer_pascal}");
428
429 // Collect includes for parameter types
430 let mut includes = HashSet::<String>::new();
431 for (_param_name, param_type) in &reducer.params_for_generate.elements {
432 collect_includes_for_type(self.module_prefix, module, param_type, &mut includes, self.module_name);
433 }
434
435 // Add {module_prefix}ReducerBase.g.h for U{module_prefix}ReducerBase definition
436 includes.insert(format!("ModuleBindings/{module_prefix}ReducerBase.g.h"));
437
438 // Convert to sorted vector
439 let mut include_vec: Vec<String> = includes.into_iter().collect();
440 include_vec.sort();
441
442 // Convert to string references
443 let include_refs: Vec<&str> = include_vec.iter().map(|s| s.as_str()).collect();
444
445 let mut header = UnrealCppAutogen::new(&include_refs, &pascal, false);
446
447 let args_struct = format!("F{pascal}Args");
448
449 // Generate reducer arguments struct
450 writeln!(header, "// Reducer arguments struct for {pascal}");
451 writeln!(header, "USTRUCT(BlueprintType)");
452 writeln!(header, "struct {} {args_struct}", self.get_api_macro());
453 writeln!(header, "{{");
454 writeln!(header, " GENERATED_BODY()");
455 writeln!(header);
456
457 // Generate properties for each parameter
458 for (param_name, param_type) in &reducer.params_for_generate.elements {
459 let param_pascal = param_name.deref().to_case(Case::Pascal);
460 let type_str = cpp_ty_fmt_with_module(self.module_prefix, module, param_type, self.module_name).to_string();
461 let init_str = cpp_ty_init_fmt_impl(self.module_prefix, module, param_type);
462 let field_decl = format!("{type_str} {param_pascal}{init_str}");
463
464 // Check if the type is blueprintable
465 if is_blueprintable(module, param_type) {
466 writeln!(header, " UPROPERTY(BlueprintReadWrite, Category=\"SpacetimeDB\")");
467 } else {
468 // Add comment explaining why the field isn't exposed as UPROPERTY
469 writeln!(
470 header,
471 " // NOTE: {type_str} field not exposed to Blueprint due to non-blueprintable elements"
472 );
473 }
474 writeln!(header, " {field_decl};");
475 writeln!(header);
476 }
477
478 // Generate default constructor
479 writeln!(header, " {args_struct}() = default;");
480 writeln!(header);
481

Callers

nothing calls this directly

Calls 15

cpp_ty_fmt_with_moduleFunction · 0.85
cpp_ty_init_fmt_implFunction · 0.85
is_blueprintableFunction · 0.85
to_caseMethod · 0.80
insertMethod · 0.65
iterMethod · 0.65
newFunction · 0.50
derefMethod · 0.45
collectMethod · 0.45
into_iterMethod · 0.45
mapMethod · 0.45

Tested by

no test coverage detected