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

Method read_compatible_conversion

rust/fory-derive/src/object/field_codec.rs:277–340  ·  view source on GitHub ↗
(&self)

Source from the content-addressed store, hash-verified

275 }
276
277 pub fn read_compatible_conversion(&self) -> TokenStream {
278 let var = &self.private_ident;
279 match &self.dispatch {
280 FieldDispatch::Codec { .. } => {
281 if let Some(read_scalar) = compatible_scalar_reader_for(self.value_ty) {
282 let call = self.codec_call();
283 let local_type = if extract_option_inner_type(self.value_ty).is_some() {
284 quote! { local_field_type.type_id }
285 } else {
286 quote! { #call::static_type_id() as u32 }
287 };
288 return quote! {
289 #var = #read_scalar(
290 context,
291 #local_type,
292 _field,
293 ).map_err(|err| fory_core::Error::invalid_data(
294 format!("compatible field '{}': {}", _field.field_name.as_str(), err)
295 ))?;
296 };
297 }
298 let call = self.codec_call();
299 quote! {
300 let remote_field_type = &_field.field_type;
301 if let Some(value) = #call::read_compatible(
302 context,
303 local_field_type,
304 remote_field_type,
305 ).map_err(|err| fory_core::Error::invalid_data(
306 format!("compatible field '{}': {}", _field.field_name.as_str(), err)
307 ))? {
308 #var = value;
309 } else {
310 return Err(fory_core::Error::invalid_data(format!(
311 "compatible field '{}' cannot convert remote type {} to local type {}",
312 _field.field_name.as_str(),
313 remote_field_type.type_id,
314 local_field_type.type_id,
315 )));
316 }
317 }
318 }
319 FieldDispatch::Serializer { .. } => {
320 let ty = self.value_ty;
321 quote! {
322 let remote_field_type = &_field.field_type;
323 let read_ref_mode =
324 fory_core::serializer::codec::field_ref_mode(remote_field_type);
325 let read_type_info = if context.is_compatible() {
326 fory_core::serializer::util::field_need_read_type_info(
327 remote_field_type.type_id
328 )
329 } else {
330 <#ty as fory_core::Serializer>::fory_is_polymorphic()
331 };
332 #var = <#ty as fory_core::Serializer>::fory_read(
333 context,
334 read_ref_mode,

Callers 1

Calls 3

codec_callMethod · 0.80

Tested by

no test coverage detected