#run-time #traits #debugging #add #auto

macro bin auto_impl_trait

auto impl trait by provide trait file

10 releases (4 breaking)

0.7.1 Oct 22, 2022
0.7.0 Oct 22, 2022
0.6.2 Oct 21, 2022
0.5.1 Oct 21, 2022
0.1.0 Oct 18, 2022

#982 in Procedural macros

MIT license

345KB
5.5K SLoC

auto_impl_trait

#[auto_impl_trait("./src/rect_trait.rs", Rect, "runtime")]
#[doc = "Test this will keep after expand"]
#[derive(Debug)]
struct Square {
    side: i32,
}

Will expand to

mod item;
mod area;
mod perimeter;
mod scale;
mod ____CGQAQ__SUPER_TRAIT____ {
    pub mod runtime {
        use std::ops::{Add, Sub, Mul, Div};

        pub trait Rect {
            type Item: Add + Sub + Mul + Div;
            fn area(&self) -> Self::Item;
            fn perimeter(&self) -> Self::Item;
            fn scale(&mut self, scale: Self::Item);
        }
    }

    pub use runtime::Rect;
}
pub mod __Rect_area__ {
    pub type Item = super::item::Item;

    #[tonic::async_trait]
    pub trait __Rect_area__ { fn area(&self) -> Item; }
}
pub mod __Rect_perimeter__ {
    pub type Item = super::item::Item;

    #[tonic::async_trait]
    pub trait __Rect_perimeter__ { fn perimeter(&self) -> Item; }
}
pub mod __Rect_scale__ {
    pub type Item = super::item::Item;

    #[tonic::async_trait]
    pub trait __Rect_scale__ { fn scale(&mut self, scale: Item); }
}
use ____CGQAQ__SUPER_TRAIT____::Rect;
#[doc = "Test this will keep after expand"]
#[derive(Debug)]
struct Square {
    side: i32,
}
#[tonic::async_trait]
impl Rect for Square {
    type Item = super::item::Item;
    fn area(&self) -> Self::Item { <dyn __Rect_area__::__Rect_area__>::area(self) }
    fn perimeter(&self) -> Self::Item { <dyn __Rect_perimeter__::__Rect_perimeter__>::perimeter(self) }
    fn scale(&mut self, scale: Self::Item) { <dyn __Rect_scale__::__Rect_scale__>::scale(self, scale) }
}

Dependencies

~8–15MB
~188K SLoC