aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2021-11-22 10:06:35 +0100
committerMartin Fischer <martin@push-f.com>2021-11-22 10:10:59 +0100
commit69a3335f1b79b074a0e1038bdfd9aa79508131d1 (patch)
treebb352dad39e880d11a1802b11c2a939e941a2ff6
parent3d3e2ac6cdce593ab68c78d583f57905523a1591 (diff)
refactor: support IntoIterMapCollect with N types
-rw-r--r--src/lib.rs16
-rw-r--r--src/parse_trait_sig.rs3
-rw-r--r--src/transform.rs14
3 files changed, 16 insertions, 17 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 3b4aeeb..caaf774 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -411,14 +411,14 @@ impl TypeTransform {
quote! {#arg.map_err(|x| #err_inner)}
}
}
- TypeTransform::CollectionOneType(type1) => {
- let type1 = type1.convert(quote!(v1));
- quote! {#arg.into_iter().map(|v1| #type1).collect()}
- }
- TypeTransform::CollectionTwoTypes(type1, type2) => {
- let type1 = type1.convert(quote!(v1));
- let type2 = type2.convert(quote!(v2));
- quote! {#arg.into_iter().map(|(v1,v2)| (#type1, #type2)).collect()}
+ TypeTransform::IntoIterMapCollect(types) => {
+ let idents = (0..types.len()).map(|i| format_ident!("v{}", i));
+ // FUTURE: let transforms = std::iter::zip(idents, types).map(|(i, t)| t.convert(quote! {#i}));
+ let transforms = types.iter().enumerate().map(|(idx, t)| {
+ let id = format_ident!("v{}", idx);
+ t.convert(quote! {#id})
+ });
+ quote! {#arg.into_iter().map(|(#(#idents),*)| (#(#transforms),*)).collect()}
}
TypeTransform::NoOp => arg,
}
diff --git a/src/parse_trait_sig.rs b/src/parse_trait_sig.rs
index be8cccb..29b3205 100644
--- a/src/parse_trait_sig.rs
+++ b/src/parse_trait_sig.rs
@@ -17,8 +17,7 @@ pub enum TypeTransform {
Into,
Box(BoxType),
Map(Box<TypeTransform>),
- CollectionOneType(Box<TypeTransform>),
- CollectionTwoTypes(Box<TypeTransform>, Box<TypeTransform>),
+ IntoIterMapCollect(Vec<TypeTransform>),
Iterator(BoxType, Box<TypeTransform>),
Result(Box<TypeTransform>, Box<TypeTransform>),
}
diff --git a/src/transform.rs b/src/transform.rs
index fa7877e..f2744cf 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -120,9 +120,9 @@ impl TypeConverter<'_> {
} else if self.known_as_collection_with_one_type(&last_seg.ident)
&& path_len == 1
{
- return Ok(TypeTransform::CollectionOneType(
- self.convert_type(arg)?.into(),
- ));
+ return Ok(TypeTransform::IntoIterMapCollect(vec![
+ self.convert_type(arg)?
+ ]));
}
}
}
@@ -140,10 +140,10 @@ impl TypeConverter<'_> {
self.convert_type(arg2)?.into(),
));
} else if self.known_as_collection_with_two_types(&last_seg.ident) {
- return Ok(TypeTransform::CollectionTwoTypes(
- self.convert_type(arg1)?.into(),
- self.convert_type(arg2)?.into(),
- ));
+ return Ok(TypeTransform::IntoIterMapCollect(vec![
+ self.convert_type(arg1)?,
+ self.convert_type(arg2)?,
+ ]));
}
}
}