[−][src]Crate easy_ext
An attribute macro for easily writing extension trait pattern.
Examples
use easy_ext::ext; #[ext(ResultExt)] impl<T, E> Result<T, E> { pub fn err_into<U>(self) -> Result<T, U> where E: Into<U>, { self.map_err(Into::into) } }
Code like this will be generated:
pub trait ResultExt<T, E> { fn err_into<U>(self) -> Result<T, U> where E: Into<U>; } impl<T, E> ResultExt<T, E> for Result<T, E> { fn err_into<U>(self) -> Result<T, U> where E: Into<U>, { self.map_err(Into::into) } }
You can elide the trait name. Note that in this case, #[ext]
assigns a random name, so you cannot import/export the generated trait.
use easy_ext::ext; #[ext] impl<T, E> Result<T, E> { fn err_into<U>(self) -> Result<T, U> where E: Into<U>, { self.map_err(Into::into) } }
Visibility
-
The visibility of the generated extension trait inherits the visibility of the item in the original
impl
.For example, if the method is
pub
then the trait will also bepub
:use easy_ext::ext; #[ext(ResultExt)] // generate `pub trait ResultExt` impl<T, E> Result<T, E> { pub fn err_into<U>(self) -> Result<T, U> where E: Into<U>, { self.map_err(Into::into) } }
-
The visibility of all the items in the original
impl
must be identical.
Supertraits
If you want the extension trait to be a subtrait of another trait,
add Self: SubTrait
bound to the where
clause.
use easy_ext::ext; #[ext(Ext)] impl<T> T where Self: Default, { fn method(&self) {} }
Supported items
use easy_ext::ext; #[ext(Ext)] impl<T> T { fn method(&self) {} }
use easy_ext::ext; #[ext(Ext)] impl<T> T { const MSG: &'static str = "Hello!"; }
Attribute Macros
ext | An attribute macro for easily writing extension trait pattern. See crate level documentation for details. |