use proc_macro2::Ident;
use quote::format_ident;
use crate::input::Field;
pub(crate) fn binding_ident(field: &Field) -> Ident {
field
.ident
.clone()
.unwrap_or_else(|| format_ident!("__field{}", field.index, span = field.span))
}
#[cfg(test)]
mod tests {
use proc_macro2::Span;
use syn::Member;
use super::*;
use crate::input::FieldAttrs;
fn make_field(ident: Option<&str>, index: usize) -> Field {
Field {
ident: ident.map(|s| syn::Ident::new(s, Span::call_site())),
member: if let Some(s) = ident {
Member::Named(syn::Ident::new(s, Span::call_site()))
} else {
Member::Unnamed(syn::Index {
index: index as u32,
span: Span::call_site()
})
},
ty: syn::parse_quote!(String),
index,
attrs: FieldAttrs::default(),
span: Span::call_site()
}
}
#[test]
fn test_binding_ident_named_field() {
let field = make_field(Some("value"), 0);
let binding = binding_ident(&field);
assert_eq!(binding.to_string(), "value");
}
#[test]
fn test_binding_ident_unnamed_field_index_0() {
let field = make_field(None, 0);
let binding = binding_ident(&field);
assert_eq!(binding.to_string(), "__field0");
}
#[test]
fn test_binding_ident_unnamed_field_index_5() {
let field = make_field(None, 5);
let binding = binding_ident(&field);
assert_eq!(binding.to_string(), "__field5");
}
#[test]
fn test_binding_ident_preserves_named_identifier() {
let field = make_field(Some("source"), 1);
let binding = binding_ident(&field);
assert_eq!(binding.to_string(), "source");
}
}