Skip to content

Commit

Permalink
Make IntoIter item field skipable
Browse files Browse the repository at this point in the history
  • Loading branch information
leudz committed Jun 16, 2024
1 parent 3d385fb commit e9f43fc
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 77 deletions.
135 changes: 61 additions & 74 deletions shipyard_proc/src/into_iter_expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,39 @@ pub(crate) fn expand_into_iter(
let mut iter_fields_variable = Punctuated::<Ident, Comma>::new();
'field: for field in fields.named.iter() {
if let syn::Type::Path(path) = &field.ty {
let field_attrs = field
.attrs
.iter()
.find(|attr| attr.path().is_ident("shipyard"));

let mut ignore = false;
let mut field_name_override = None;
field_attrs
.map(|attr| {
attr.parse_nested_meta(|meta| {
if meta.path.is_ident("item_field_skip") {
ignore = true;

Ok(())
} else if meta.path.is_ident("item_field_name") {
let value = meta.value()?;
let s: LitStr = value.parse()?;
field_name_override = Some(Ident::new(&s.value(), field.ident.span()));

Ok(())
} else {
Err(Error::new(
meta.path.span(),
"Unknown attribute. Possible attribute: item_field_skip, item_field_name",
))
}
})
}).transpose()?;

if ignore {
continue;
}

for segment in path.path.segments.iter() {
let segment_ident = segment.ident.to_string();

Expand All @@ -109,43 +142,20 @@ pub(crate) fn expand_into_iter(
let tracking_ty = tys.next();

let field_name = field.ident.clone().unwrap();
let trimmed_field_name = field
.attrs
.iter()
.find(|attr| attr.path().is_ident("shipyard"))
.map::<Result<Ident>, _>(|attr| {
let mut item_name = String::new();
attr.parse_nested_meta(|meta| {
if meta.path.is_ident("item_field_name") {
let value = meta.value()?;
let s: LitStr = value.parse()?;
item_name = s.value();

Ok(())
} else {
Err(Error::new(
meta.path.span(),
"Unknown attribute. Possible attribute: item_field_name",
))
}
})?;

Ok(Ident::new(&item_name, field_name.span()))
})
.unwrap_or_else(|| {
let field_name = field.ident.as_ref().unwrap();
let field_name_string = field_name.to_string();
let trimmed = field_name_string.trim_start_matches("v_");

Ok(Ident::new(
if trimmed.len() < field_name_string.len() {
trimmed
} else {
field_name_string.as_str()
},
field_name.span(),
))
})?;
let trimmed_field_name = field_name_override.unwrap_or_else(|| {
let field_name = field.ident.as_ref().unwrap();
let field_name_string = field_name.to_string();
let trimmed = field_name_string.trim_start_matches("v_");

Ident::new(
if trimmed.len() < field_name_string.len() {
trimmed
} else {
field_name_string.as_str()
},
field_name.span(),
)
});
let item_ty = parse_quote!(#trimmed_field_name: <<&'__tmp shipyard::View<'__view, #comp_ty, #tracking_ty> as shipyard::iter::IntoAbstract>::AbsView as shipyard::iter::AbstractMut>::Out);
item_fields.push(item_ty);

Expand Down Expand Up @@ -184,43 +194,20 @@ pub(crate) fn expand_into_iter(
let tracking_ty = tys.next();

let field_name = field.ident.clone().unwrap();
let trimmed_field_name = field
.attrs
.iter()
.find(|attr| attr.path().is_ident("shipyard"))
.map::<Result<Ident>, _>(|attr| {
let mut item_name = String::new();
attr.parse_nested_meta(|meta| {
if meta.path.is_ident("item_field_name") {
let value = meta.value()?;
let s: LitStr = value.parse()?;
item_name = s.value();

Ok(())
} else {
Err(Error::new(
meta.path.span(),
"Unknown attribute. Possible attribute: item_field_name",
))
}
})?;

Ok(Ident::new(&item_name, field_name.span()))
})
.unwrap_or_else(|| {
let field_name = field.ident.as_ref().unwrap();
let field_name_string = field_name.to_string();
let trimmed = field_name_string.trim_start_matches("vm_");

Ok(Ident::new(
if trimmed.len() < field_name_string.len() {
trimmed
} else {
field_name_string.as_str()
},
field_name.span(),
))
})?;
let trimmed_field_name = field_name_override.unwrap_or_else(|| {
let field_name = field.ident.as_ref().unwrap();
let field_name_string = field_name.to_string();
let trimmed = field_name_string.trim_start_matches("vm_");

Ident::new(
if trimmed.len() < field_name_string.len() {
trimmed
} else {
field_name_string.as_str()
},
field_name.span(),
)
});
let item_ty = parse_quote!(#trimmed_field_name: <<&'__tmp mut shipyard::ViewMut<'__view, #comp_ty, #tracking_ty> as shipyard::iter::IntoAbstract>::AbsView as shipyard::iter::AbstractMut>::Out);
item_fields.push(item_ty);

Expand Down
12 changes: 9 additions & 3 deletions tests/derive/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,21 @@ fn into_iter_rename() {
a: View<'a, A>,
#[shipyard(item_field_name = "some_other_name")]
vm_a: ViewMut<'a, A>,

#[shipyard(item_field_skip)]
_aa: View<'a, A>,
#[shipyard(item_field_skip)]
_vm_aa: ViewMut<'a, A>,
}

let world = World::new();

world.run(|mut custom: AView| {
for a in custom.iter() {
let _: OtherName = a;
a.some_name;
a.some_other_name;
let OtherName {
some_name: _,
some_other_name: _,
} = a;
}
});
}

0 comments on commit e9f43fc

Please sign in to comment.