@@ -86,6 +86,37 @@ pub fn generate_struct_pointer<T: SerializeConfig>(
8686 res
8787}
8888
89+ /// Generates pointers for an optional struct:
90+ /// - All fields under `target_prefix` (using `default_instance.dump()`), pointed to by each prefix
91+ /// in `pointer_prefixes`.
92+ /// - The optional flag `<target_prefix>.#is_none`, pointed to by `<prefix>.#is_none` for each
93+ /// prefix in `pointer_prefixes`.
94+ pub fn generate_optional_struct_pointer < T : SerializeConfig > (
95+ target_prefix : ParamPath ,
96+ default_instance : & T ,
97+ pointer_prefixes : HashSet < ParamPath > ,
98+ is_none_default : bool ,
99+ is_none_description : & str ,
100+ ) -> ConfigPointers {
101+ let mut res =
102+ generate_struct_pointer ( target_prefix. clone ( ) , default_instance, pointer_prefixes. clone ( ) ) ;
103+
104+ // Add a pointer target and pointing params for the optional flag.
105+ let target_is_none_param = format ! ( "{target_prefix}{FIELD_SEPARATOR}{IS_NONE_MARK}" ) ;
106+ let pointer_target = ser_pointer_target_param (
107+ target_is_none_param. as_str ( ) ,
108+ & is_none_default,
109+ is_none_description,
110+ ) ;
111+ let pointing_params: Pointers = pointer_prefixes
112+ . into_iter ( )
113+ . map ( |prefix| format ! ( "{prefix}{FIELD_SEPARATOR}{IS_NONE_MARK}" ) )
114+ . collect ( ) ;
115+ res. push ( ( pointer_target, pointing_params) ) ;
116+
117+ res
118+ }
119+
89120// Converts a serialized param to a pointer target.
90121fn serialized_param_to_pointer_target (
91122 target_prefix : ParamPath ,
0 commit comments