(&self, module: &ModuleDef, reducer: &ReducerDef)
| 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 |
nothing calls this directly
no test coverage detected