MCPcopy Create free account
hub / github.com/apache/fory / gen_write_data

Function gen_write_data

rust/fory-derive/src/object/write.rs:51–107  ·  view source on GitHub ↗
(source_fields: &[SourceField<'_>])

Source from the content-addressed store, hash-verified

49}
50
51pub fn gen_write_data(source_fields: &[SourceField<'_>]) -> TokenStream {
52 let fields: Vec<&Field> = source_fields.iter().map(|sf| sf.field).collect();
53 let bindings = match build_bindings(source_fields) {
54 Ok(bindings) => bindings,
55 Err(err) => return err.to_compile_error(),
56 };
57 let write_fields_ts: Vec<_> = bindings
58 .iter()
59 .filter_map(|binding| match binding {
60 FieldBinding::Codec(binding) => {
61 let base = binding.write_field();
62 if is_debug_enabled() {
63 let value_ts = get_field_accessor(
64 binding.source.field,
65 binding.source.original_index,
66 true,
67 );
68 let struct_name = get_struct_name().expect("struct context not set");
69 let struct_name_lit =
70 syn::LitStr::new(&struct_name, proc_macro2::Span::call_site());
71 let field_name_lit = syn::LitStr::new(
72 &binding.source.field_name,
73 proc_macro2::Span::call_site(),
74 );
75 Some(quote! {
76 fory_core::serializer::struct_::struct_before_write_field(
77 #struct_name_lit,
78 #field_name_lit,
79 (&#value_ts) as &dyn ::std::any::Any,
80 context,
81 );
82 #base
83 fory_core::serializer::struct_::struct_after_write_field(
84 #struct_name_lit,
85 #field_name_lit,
86 (&#value_ts) as &dyn ::std::any::Any,
87 context,
88 );
89 })
90 } else {
91 Some(base)
92 }
93 }
94 FieldBinding::Skipped(_) => None,
95 })
96 .collect();
97
98 let version_hash_ts = gen_struct_version_hash_ts(&fields);
99 quote! {
100 if context.is_check_struct_version() {
101 let version_hash: i32 = #version_hash_ts;
102 context.writer.write_i32(version_hash);
103 }
104 #(#write_fields_ts)*
105 Ok(())
106 }
107}
108

Callers 1

derive_serializerFunction · 0.70

Calls 8

build_bindingsFunction · 0.85
is_debug_enabledFunction · 0.85
get_field_accessorFunction · 0.85
get_struct_nameFunction · 0.85
SomeFunction · 0.85
mapMethod · 0.45
write_fieldMethod · 0.45

Tested by

no test coverage detected