aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml2
-rw-r--r--README.md11
-rw-r--r--src/parse_assoc_type.rs4
-rw-r--r--tests/tests.rs2
4 files changed, 10 insertions, 9 deletions
diff --git a/Cargo.toml b/Cargo.toml
index d6fec25..51fed6e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "dynamize"
-version = "0.3.1"
+version = "0.3.2"
description = "proc macro to make traits with associated types object-safe"
authors = ["Martin Fischer <martin@push-f.com>"]
license = "MIT"
diff --git a/README.md b/README.md
index 4a383fe..573c30b 100644
--- a/README.md
+++ b/README.md
@@ -72,12 +72,13 @@ automatically also implements `DynClient`!
## How does this actually work?
The destination type of an associated type is
-determined by looking at its first trait bound:
+determined by looking at its trait bounds:
-* `Into<T>` is mapped to `T`
+* if the first trait bound is `Into<T>` the destination type is `T`
-* `SomeTrait` is mapped to `Box<dyn SomeTrait>`
- (for this `SomeTrait` of course needs to be object-safe)
+* otherwise the destination type is the boxed trait object of all trait bounds
+ e.g. `Error + Send` becomes `Box<dyn Error + Send>`
+ (for this the first trait bound needs to be object-safe)
Dynamize can convert associated types in:
@@ -132,7 +133,7 @@ async functions in traits, you'll have to additionally use another library like
#[blanket_impl_attr(async_trait)]
#[async_trait]
trait Client: Sync {
- type Error: std::error::Error;
+ type Error: std::error::Error + Send;
async fn get(&self, url: String) -> Result<Vec<u8>, Self::Error>;
}
diff --git a/src/parse_assoc_type.rs b/src/parse_assoc_type.rs
index 048e58c..856735d 100644
--- a/src/parse_assoc_type.rs
+++ b/src/parse_assoc_type.rs
@@ -79,11 +79,11 @@ pub fn parse_assoc_type(
}
}
}
- let path = &bound.path;
+ let bounds = &assoc_type.bounds;
return Ok((
&assoc_type.ident,
DestType::Box(BoxType {
- inner: quote! {dyn #path},
+ inner: quote! {dyn #bounds},
placeholder_lifetime: !lifetime_bounds(&assoc_type.bounds)
.any(|l| l.ident == "static"),
}),
diff --git a/tests/tests.rs b/tests/tests.rs
index b326b4b..bae52bd 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -213,7 +213,7 @@ trait ReturnIter {
#[dynamize::dynamize]
trait FunIter {
- type A: std::error::Error;
+ type A: std::error::Error + Send;
fn foobar<F: Fn(&mut dyn Iterator<Item = Self::A>)>(&mut self, f: F);