Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Prev Previous commit
Next Next commit
More mapping, less for-looping
  • Loading branch information
KiChjang committed Aug 19, 2021
commit d5e8c15725a96d7d5b93d31cfa40939a84fe3209
26 changes: 13 additions & 13 deletions xcm/procedural/src/v0/multilocation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,19 +81,19 @@ fn generate_conversion_from_tuples() -> TokenStream {
}

fn generate_conversion_from_v1() -> TokenStream {
let mut match_variants = TokenStream::new();

for cur_num in 0..8u8 {
let variant = format_ident!("X{}", cur_num + 1);
let idents = (1..=cur_num).map(|i| format_ident!("j{}", i)).collect::<Vec<_>>();

match_variants.extend(quote! {
crate::v1::Junctions::#variant( j0 #(, #idents)* ) => res
.pushed_with(Junction::from(j0))
#( .and_then(|res| res.pushed_with(Junction::from(#idents))) )*
.map_err(|_| ()),
});
}
let match_variants = (0..8u8)
.map(|cur_num| {
let variant = format_ident!("X{}", cur_num + 1);
let idents = (1..=cur_num).map(|i| format_ident!("j{}", i)).collect::<Vec<_>>();

quote! {
crate::v1::Junctions::#variant( j0 #(, #idents)* ) => res
.pushed_with(Junction::from(j0))
#( .and_then(|res| res.pushed_with(Junction::from(#idents))) )*
.map_err(|_| ()),
}
})
.collect::<TokenStream>();

quote! {
impl TryFrom<crate::v1::MultiLocation> for MultiLocation {
Expand Down
70 changes: 36 additions & 34 deletions xcm/procedural/src/v1/multilocation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,41 +151,43 @@ fn generate_conversion_from_tuples(max_parents: u8) -> TokenStream {
}

fn generate_conversion_from_v0() -> TokenStream {
let mut match_variants = TokenStream::new();

for cur_num in 0..8u8 {
let mut intermediate_match_arms = TokenStream::new();
let num_ancestors = cur_num + 1;
let variant = format_ident!("X{}", num_ancestors);
let idents = (0..=cur_num).map(|i| format_ident!("j{}", i)).collect::<Vec<_>>();

for parent_count in (1..num_ancestors).rev() {
let parent_idents =
(0..parent_count).map(|j| format_ident!("j{}", j)).collect::<Vec<_>>();
let junction_idents = (parent_count..num_ancestors)
.map(|j| format_ident!("j{}", j))
.collect::<Vec<_>>();
let junction_variant = format_ident!("X{}", num_ancestors - parent_count);

intermediate_match_arms.extend(quote! {
crate::v0::MultiLocation::#variant( #(#idents),* )
if #( #parent_idents.is_parent() )&&* =>
Ok(MultiLocation {
parents: #parent_count,
interior: #junction_variant( #( #junction_idents.try_into()? ),* ),
}),
});
}
let match_variants = (0..8u8)
.map(|cur_num| {
let num_ancestors = cur_num + 1;
let variant = format_ident!("X{}", num_ancestors);
let idents = (0..=cur_num).map(|i| format_ident!("j{}", i)).collect::<Vec<_>>();

let intermediate_match_arms = (1..num_ancestors)
.rev()
.map(|parent_count| {
let parent_idents =
(0..parent_count).map(|j| format_ident!("j{}", j)).collect::<Vec<_>>();
let junction_idents = (parent_count..num_ancestors)
.map(|j| format_ident!("j{}", j))
.collect::<Vec<_>>();
let junction_variant = format_ident!("X{}", num_ancestors - parent_count);

quote! {
crate::v0::MultiLocation::#variant( #(#idents),* )
if #( #parent_idents.is_parent() )&&* =>
Ok(MultiLocation {
parents: #parent_count,
interior: #junction_variant( #( #junction_idents.try_into()? ),* ),
}),
}
})
.collect::<TokenStream>();

match_variants.extend(quote! {
crate::v0::MultiLocation::#variant( #(#idents),* )
if #( #idents.is_parent() )&&* =>
Ok(MultiLocation::ancestor(#num_ancestors)),
#intermediate_match_arms
crate::v0::MultiLocation::#variant( #(#idents),* ) =>
Ok( #variant( #( #idents.try_into()? ),* ).into() ),
});
}
quote! {
crate::v0::MultiLocation::#variant( #(#idents),* )
if #( #idents.is_parent() )&&* =>
Ok(MultiLocation::ancestor(#num_ancestors)),
#intermediate_match_arms
crate::v0::MultiLocation::#variant( #(#idents),* ) =>
Ok( #variant( #( #idents.try_into()? ),* ).into() ),
}
})
.collect::<TokenStream>();

quote! {
impl TryFrom<crate::v0::MultiLocation> for MultiLocation {
Expand Down