dyn_shim 0.2.0

Generate dyn-compatible shim traits
Documentation

dyn_shim

crates.io docs.rs CI license

Generate a dyn-compatible shim trait and blanket impl from a source trait that is not dyn-compatible.

Some traits are not dyn-compatible, so you cannot hold a mixed set of implementors behind one Box<dyn Trait>. The #[dyn_shim(Name)] attribute reads the trait it is applied to, builds a second trait containing only the dyn-compatible subset, and forwards each call to the original. Every implementor of the source trait then works as a dyn shim.

Usage

Add the dependency:

[dependencies]
dyn_shim = "0.2"

Annotate the trait with #[dyn_shim(Name)], where Name is the shim trait to generate:

use dyn_shim::dyn_shim;

#[dyn_shim(DynSink)]
trait Sink {
    // ...
}

Bounds after the shim's name become its supertraits. A Clone or Hash in the list is recognized and handled specially: it makes the shim's trait objects themselves cloneable (including ToOwned) or hashable, covering the marker combinations of any auto traits listed alongside:

use dyn_shim::dyn_shim;

#[dyn_shim(DynShape: Clone + Send)]
trait Shape {
    fn area(&self) -> f64;
    fn scale(&mut self, factor: f64);
}

// Box<dyn DynShape> and Box<dyn DynShape + Send> implement Clone.

See the API documentation for details.

Testing

cargo test

The suite includes trybuild UI tests under tests/ui/ that assert the compile errors for rejected traits and methods.

License

Licensed under the MIT license. See LICENSE for details.