| 23 | |
| 24 | impl FieldsExt for Fields { |
| 25 | fn views(&self) -> Vec<FieldView<'_>> { |
| 26 | self.iter() |
| 27 | .enumerate() |
| 28 | .map(|(i, field)| { |
| 29 | let binding = field.ident.clone().unwrap_or_else(|| format_ident!("v{}", i)); |
| 30 | let member: Member = match &field.ident { |
| 31 | Some(name) => Member::Named(name.clone()), |
| 32 | None => Member::Unnamed(Index { index: i as u32, span: Span::call_site() }), |
| 33 | }; |
| 34 | let ty: &Type = match &field.ty { |
| 35 | Type::Reference(r) => r.elem.as_ref(), |
| 36 | t => t, |
| 37 | }; |
| 38 | let is_option = option_inner(ty).is_some(); |
| 39 | FieldView { binding, member, ty, is_option } |
| 40 | }) |
| 41 | .collect() |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | /// If `ty` is `Option<T>`, return `Some(&T)`. Otherwise `None`. |