(
source_fields: &'a [SourceField<'a>],
)
| 402 | } |
| 403 | |
| 404 | pub(crate) fn build_bindings<'a>( |
| 405 | source_fields: &'a [SourceField<'a>], |
| 406 | ) -> syn::Result<Vec<FieldBinding<'a>>> { |
| 407 | source_fields |
| 408 | .iter() |
| 409 | .map(|source| { |
| 410 | let meta = parse_field_meta(source.field)?; |
| 411 | let private_ident = create_private_field_name(source.field, source.original_index); |
| 412 | if meta.skip { |
| 413 | return Ok(FieldBinding::Skipped(SkippedField { |
| 414 | source, |
| 415 | private_ident, |
| 416 | })); |
| 417 | } |
| 418 | let type_class = classify_field_type(&source.field.ty); |
| 419 | let is_outer_option = is_option_type(&source.field.ty); |
| 420 | let nullable = meta.effective_nullable(type_class) || is_outer_option; |
| 421 | let track_ref = meta.effective_ref(type_class); |
| 422 | let field_id = if meta.uses_tag_id() { |
| 423 | meta.effective_id() as i16 |
| 424 | } else { |
| 425 | -1 |
| 426 | }; |
| 427 | let dispatch = field_dispatch_for(&source.field.ty, &meta, nullable, track_ref)?; |
| 428 | Ok(FieldBinding::Codec(ResolvedField { |
| 429 | source, |
| 430 | private_ident, |
| 431 | dispatch, |
| 432 | value_ty: &source.field.ty, |
| 433 | field_id, |
| 434 | })) |
| 435 | }) |
| 436 | .collect() |
| 437 | } |
| 438 | |
| 439 | fn field_dispatch_for( |
| 440 | ty: &Type, |
no test coverage detected