mirror of
https://github.com/async-rs/async-std.git
synced 2025-01-30 09:15:33 +00:00
Remove extension_trait
.
At this point, `extension_trait` is basically an expensive no-op. This commit removes it. The next commit will adjust the indentation.
This commit is contained in:
parent
2dde8820fa
commit
1146c66f1b
7 changed files with 52 additions and 102 deletions
|
@ -22,7 +22,6 @@ cfg_unstable_default! {
|
|||
|
||||
pub use core::future::Future as Future;
|
||||
|
||||
extension_trait! {
|
||||
#[doc = r#"
|
||||
Extension methods for [`Future`].
|
||||
|
||||
|
@ -45,7 +44,7 @@ extension_trait! {
|
|||
/// ```
|
||||
#[cfg(feature = "unstable")]
|
||||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn delay(self, dur: Duration) -> [DelayFuture<Self>]
|
||||
fn delay(self, dur: Duration) -> DelayFuture<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
|
@ -70,7 +69,7 @@ extension_trait! {
|
|||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn flatten(
|
||||
self,
|
||||
) -> [FlattenFuture<Self, <Self::Output as IntoFuture>::Future>]
|
||||
) -> FlattenFuture<Self, <Self::Output as IntoFuture>::Future>
|
||||
where
|
||||
Self: Sized,
|
||||
<Self as Future>::Output: IntoFuture,
|
||||
|
@ -112,7 +111,7 @@ extension_trait! {
|
|||
fn race<F>(
|
||||
self,
|
||||
other: F,
|
||||
) -> [Race<Self, F>]
|
||||
) -> Race<Self, F>
|
||||
where
|
||||
Self: std::future::Future + Sized,
|
||||
F: std::future::Future<Output = <Self as std::future::Future>::Output>,
|
||||
|
@ -158,7 +157,7 @@ extension_trait! {
|
|||
fn try_race<F, T, E>(
|
||||
self,
|
||||
other: F
|
||||
) -> [TryRace<Self, F>]
|
||||
) -> TryRace<Self, F>
|
||||
where
|
||||
Self: std::future::Future<Output = Result<T, E>> + Sized,
|
||||
F: std::future::Future<Output = <Self as std::future::Future>::Output>,
|
||||
|
@ -195,7 +194,7 @@ extension_trait! {
|
|||
fn join<F>(
|
||||
self,
|
||||
other: F
|
||||
) -> [Join<Self, F>]
|
||||
) -> Join<Self, F>
|
||||
where
|
||||
Self: std::future::Future + Sized,
|
||||
F: std::future::Future,
|
||||
|
@ -242,7 +241,7 @@ extension_trait! {
|
|||
fn try_join<F, A, B, E>(
|
||||
self,
|
||||
other: F
|
||||
) -> [TryJoin<Self, F>]
|
||||
) -> TryJoin<Self, F>
|
||||
where
|
||||
Self: std::future::Future<Output = Result<A, E>> + Sized,
|
||||
F: std::future::Future<Output = Result<B, E>>,
|
||||
|
@ -278,13 +277,12 @@ extension_trait! {
|
|||
"#]
|
||||
#[cfg(any(all(feature = "default", feature = "unstable"), feature = "docs"))]
|
||||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn timeout(self, dur: Duration) -> [TimeoutFuture<Self>]
|
||||
fn timeout(self, dur: Duration) -> TimeoutFuture<Self>
|
||||
where Self: Sized
|
||||
{
|
||||
TimeoutFuture::new(self, dur)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Future + ?Sized> FutureExt for T {}
|
||||
|
||||
|
|
|
@ -17,7 +17,6 @@ use crate::task::{Context, Poll};
|
|||
|
||||
pub use futures_io::AsyncBufRead as BufRead;
|
||||
|
||||
extension_trait! {
|
||||
#[doc = r#"
|
||||
Extension methods for [`BufRead`].
|
||||
|
||||
|
@ -78,7 +77,7 @@ extension_trait! {
|
|||
&'a mut self,
|
||||
byte: u8,
|
||||
buf: &'a mut Vec<u8>,
|
||||
) -> [ReadUntilFuture<'a, Self>]
|
||||
) -> ReadUntilFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -131,7 +130,7 @@ extension_trait! {
|
|||
fn read_line<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a mut String,
|
||||
) -> [ReadLineFuture<'a, Self>]
|
||||
) -> ReadLineFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -237,7 +236,6 @@ extension_trait! {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: BufRead + ?Sized> BufReadExt for T {}
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ pub use take::Take;
|
|||
|
||||
pub use futures_io::AsyncRead as Read;
|
||||
|
||||
extension_trait! {
|
||||
#[doc = r#"
|
||||
Extension methods for [`Read`].
|
||||
|
||||
|
@ -64,7 +63,7 @@ extension_trait! {
|
|||
fn read<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a mut [u8],
|
||||
) -> [ReadFuture<'a, Self>]
|
||||
) -> ReadFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin
|
||||
{
|
||||
|
@ -86,7 +85,7 @@ extension_trait! {
|
|||
fn read_vectored<'a>(
|
||||
&'a mut self,
|
||||
bufs: &'a mut [IoSliceMut<'a>],
|
||||
) -> [ReadVectoredFuture<'a, Self>]
|
||||
) -> ReadVectoredFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -123,7 +122,7 @@ extension_trait! {
|
|||
fn read_to_end<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a mut Vec<u8>,
|
||||
) -> [ReadToEndFuture<'a, Self>]
|
||||
) -> ReadToEndFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -162,7 +161,7 @@ extension_trait! {
|
|||
fn read_to_string<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a mut String,
|
||||
) -> [ReadToStringFuture<'a, Self>]
|
||||
) -> ReadToStringFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -217,7 +216,7 @@ extension_trait! {
|
|||
fn read_exact<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a mut [u8],
|
||||
) -> [ReadExactFuture<'a, Self>]
|
||||
) -> ReadExactFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -373,7 +372,6 @@ extension_trait! {
|
|||
Chain { first: self, second: next, done_first: false }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Read + ?Sized> ReadExt for T {}
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@ use crate::io::SeekFrom;
|
|||
|
||||
pub use futures_io::AsyncSeek as Seek;
|
||||
|
||||
extension_trait! {
|
||||
#[doc = r#"
|
||||
Extension methods for [`Seek`].
|
||||
|
||||
|
@ -40,13 +39,12 @@ extension_trait! {
|
|||
fn seek(
|
||||
&mut self,
|
||||
pos: SeekFrom,
|
||||
) -> [SeekFuture<'_, Self>]
|
||||
) -> SeekFuture<'_, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
SeekFuture { seeker: self, pos }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Seek + ?Sized> SeekExt for T {}
|
||||
|
|
|
@ -14,7 +14,6 @@ use crate::io::{self, IoSlice};
|
|||
|
||||
pub use futures_io::AsyncWrite as Write;
|
||||
|
||||
extension_trait! {
|
||||
#[doc = r#"
|
||||
Extension methods for [`Write`].
|
||||
|
||||
|
@ -49,7 +48,7 @@ extension_trait! {
|
|||
fn write<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a [u8],
|
||||
) -> [WriteFuture<'a, Self>]
|
||||
) -> WriteFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -75,7 +74,7 @@ extension_trait! {
|
|||
# Ok(()) }) }
|
||||
```
|
||||
"#]
|
||||
fn flush(&mut self) -> [FlushFuture<'_, Self>]
|
||||
fn flush(&mut self) -> FlushFuture<'_, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -97,7 +96,7 @@ extension_trait! {
|
|||
fn write_vectored<'a>(
|
||||
&'a mut self,
|
||||
bufs: &'a [IoSlice<'a>],
|
||||
) -> [WriteVectoredFuture<'a, Self>]
|
||||
) -> WriteVectoredFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -133,7 +132,7 @@ extension_trait! {
|
|||
fn write_all<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a [u8],
|
||||
) -> [WriteAllFuture<'a, Self>]
|
||||
) -> WriteAllFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -170,7 +169,7 @@ extension_trait! {
|
|||
fn write_fmt<'a>(
|
||||
&'a mut self,
|
||||
fmt: std::fmt::Arguments<'_>,
|
||||
) -> [WriteFmtFuture<'a, Self>]
|
||||
) -> WriteFmtFuture<'a, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -184,6 +183,5 @@ extension_trait! {
|
|||
WriteFmtFuture { writer: self, res: Some(res), buffer: None, amt: 0 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Write + ?Sized> WriteExt for T {}
|
||||
|
|
|
@ -145,7 +145,6 @@ cfg_unstable! {
|
|||
|
||||
pub use futures_core::stream::Stream as Stream;
|
||||
|
||||
extension_trait! {
|
||||
#[doc = r#"
|
||||
Extension methods for [`Stream`].
|
||||
|
||||
|
@ -177,7 +176,7 @@ extension_trait! {
|
|||
# }) }
|
||||
```
|
||||
"#]
|
||||
fn next(&mut self) -> [NextFuture<'_, Self>]
|
||||
fn next(&mut self) -> NextFuture<'_, Self>
|
||||
where
|
||||
Self: Unpin,
|
||||
{
|
||||
|
@ -629,7 +628,7 @@ extension_trait! {
|
|||
"#]
|
||||
fn last(
|
||||
self,
|
||||
) -> [LastFuture<Self, Self::Item>]
|
||||
) -> LastFuture<Self, Self::Item>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
|
@ -839,7 +838,7 @@ extension_trait! {
|
|||
fn min_by_key<B, F>(
|
||||
self,
|
||||
key_by: F,
|
||||
) -> [MinByKeyFuture<Self, Self::Item, F>]
|
||||
) -> MinByKeyFuture<Self, Self::Item, F>
|
||||
where
|
||||
Self: Sized,
|
||||
B: Ord,
|
||||
|
@ -875,7 +874,7 @@ extension_trait! {
|
|||
fn max_by_key<B, F>(
|
||||
self,
|
||||
key_by: F,
|
||||
) -> [MaxByKeyFuture<Self, Self::Item, F>]
|
||||
) -> MaxByKeyFuture<Self, Self::Item, F>
|
||||
where
|
||||
Self: Sized,
|
||||
B: Ord,
|
||||
|
@ -914,7 +913,7 @@ extension_trait! {
|
|||
fn min_by<F>(
|
||||
self,
|
||||
compare: F,
|
||||
) -> [MinByFuture<Self, F, Self::Item>]
|
||||
) -> MinByFuture<Self, F, Self::Item>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
|
||||
|
@ -947,7 +946,7 @@ extension_trait! {
|
|||
"#]
|
||||
fn max(
|
||||
self,
|
||||
) -> [MaxFuture<Self, Self::Item>]
|
||||
) -> MaxFuture<Self, Self::Item>
|
||||
where
|
||||
Self: Sized,
|
||||
Self::Item: Ord,
|
||||
|
@ -980,7 +979,7 @@ extension_trait! {
|
|||
"#]
|
||||
fn min(
|
||||
self,
|
||||
) -> [MinFuture<Self, Self::Item>]
|
||||
) -> MinFuture<Self, Self::Item>
|
||||
where
|
||||
Self: Sized,
|
||||
Self::Item: Ord,
|
||||
|
@ -1018,7 +1017,7 @@ extension_trait! {
|
|||
fn max_by<F>(
|
||||
self,
|
||||
compare: F,
|
||||
) -> [MaxByFuture<Self, F, Self::Item>]
|
||||
) -> MaxByFuture<Self, F, Self::Item>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
|
||||
|
@ -1082,7 +1081,7 @@ extension_trait! {
|
|||
fn nth(
|
||||
&mut self,
|
||||
n: usize,
|
||||
) -> [NthFuture<'_, Self>]
|
||||
) -> NthFuture<'_, Self>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
{
|
||||
|
@ -1138,7 +1137,7 @@ extension_trait! {
|
|||
fn all<F>(
|
||||
&mut self,
|
||||
f: F,
|
||||
) -> [AllFuture<'_, Self, F, Self::Item>]
|
||||
) -> AllFuture<'_, Self, F, Self::Item>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
F: FnMut(Self::Item) -> bool,
|
||||
|
@ -1187,7 +1186,7 @@ extension_trait! {
|
|||
fn find<P>(
|
||||
&mut self,
|
||||
p: P,
|
||||
) -> [FindFuture<'_, Self, P>]
|
||||
) -> FindFuture<'_, Self, P>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
P: FnMut(&Self::Item) -> bool,
|
||||
|
@ -1215,7 +1214,7 @@ extension_trait! {
|
|||
fn find_map<F, B>(
|
||||
&mut self,
|
||||
f: F,
|
||||
) -> [FindMapFuture<'_, Self, F>]
|
||||
) -> FindMapFuture<'_, Self, F>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
F: FnMut(Self::Item) -> Option<B>,
|
||||
|
@ -1249,7 +1248,7 @@ extension_trait! {
|
|||
self,
|
||||
init: B,
|
||||
f: F,
|
||||
) -> [FoldFuture<Self, F, B>]
|
||||
) -> FoldFuture<Self, F, B>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnMut(B, Self::Item) -> B,
|
||||
|
@ -1286,7 +1285,7 @@ extension_trait! {
|
|||
fn partition<B, F>(
|
||||
self,
|
||||
f: F,
|
||||
) -> [PartitionFuture<Self, F, B>]
|
||||
) -> PartitionFuture<Self, F, B>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnMut(&Self::Item) -> bool,
|
||||
|
@ -1322,7 +1321,7 @@ extension_trait! {
|
|||
fn for_each<F>(
|
||||
self,
|
||||
f: F,
|
||||
) -> [ForEachFuture<Self, F>]
|
||||
) -> ForEachFuture<Self, F>
|
||||
where
|
||||
Self: Sized,
|
||||
F: FnMut(Self::Item),
|
||||
|
@ -1378,7 +1377,7 @@ extension_trait! {
|
|||
fn any<F>(
|
||||
&mut self,
|
||||
f: F,
|
||||
) -> [AnyFuture<'_, Self, F, Self::Item>]
|
||||
) -> AnyFuture<'_, Self, F, Self::Item>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
F: FnMut(Self::Item) -> bool,
|
||||
|
@ -1614,7 +1613,7 @@ extension_trait! {
|
|||
&mut self,
|
||||
init: T,
|
||||
f: F,
|
||||
) -> [TryFoldFuture<'_, Self, F, T>]
|
||||
) -> TryFoldFuture<'_, Self, F, T>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
F: FnMut(B, Self::Item) -> Result<T, E>,
|
||||
|
@ -1659,7 +1658,7 @@ extension_trait! {
|
|||
fn try_for_each<F, E>(
|
||||
&mut self,
|
||||
f: F,
|
||||
) -> [TryForEachFuture<'_, Self, F>]
|
||||
) -> TryForEachFuture<'_, Self, F>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
F: FnMut(Self::Item) -> Result<(), E>,
|
||||
|
@ -1741,7 +1740,7 @@ extension_trait! {
|
|||
"#]
|
||||
#[cfg(feature = "unstable")]
|
||||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn unzip<A, B, FromA, FromB>(self) -> [UnzipFuture<Self, FromA, FromB>]
|
||||
fn unzip<A, B, FromA, FromB>(self) -> UnzipFuture<Self, FromA, FromB>
|
||||
where
|
||||
FromA: Default + Extend<A>,
|
||||
FromB: Default + Extend<B>,
|
||||
|
@ -1805,7 +1804,7 @@ extension_trait! {
|
|||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn collect<'a, B>(
|
||||
self,
|
||||
) -> [Pin<Box<dyn Future<Output = B> + 'a + Send>>]
|
||||
) -> Pin<Box<dyn Future<Output = B> + 'a + Send>>
|
||||
where
|
||||
Self: Sized + 'a + Send,
|
||||
B: FromStream<Self::Item>,
|
||||
|
@ -1879,7 +1878,7 @@ extension_trait! {
|
|||
fn partial_cmp<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [PartialCmpFuture<Self, S>]
|
||||
) -> PartialCmpFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Stream,
|
||||
|
@ -1919,7 +1918,7 @@ extension_trait! {
|
|||
fn position<P>(
|
||||
&mut self,
|
||||
predicate: P,
|
||||
) -> [PositionFuture<'_, Self, P>]
|
||||
) -> PositionFuture<'_, Self, P>
|
||||
where
|
||||
Self: Unpin + Sized,
|
||||
P: FnMut(Self::Item) -> bool,
|
||||
|
@ -1957,7 +1956,7 @@ extension_trait! {
|
|||
fn cmp<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [CmpFuture<Self, S>]
|
||||
) -> CmpFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Stream,
|
||||
|
@ -1988,7 +1987,7 @@ extension_trait! {
|
|||
"#]
|
||||
#[cfg(feature = "unstable")]
|
||||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn count(self) -> [CountFuture<Self>]
|
||||
fn count(self) -> CountFuture<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
|
@ -2023,7 +2022,7 @@ extension_trait! {
|
|||
fn ne<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [NeFuture<Self, S>]
|
||||
) -> NeFuture<Self, S>
|
||||
where
|
||||
Self: Sized,
|
||||
S: Sized + Stream,
|
||||
|
@ -2060,7 +2059,7 @@ extension_trait! {
|
|||
fn ge<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [GeFuture<Self, S>]
|
||||
) -> GeFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Stream,
|
||||
|
@ -2097,7 +2096,7 @@ extension_trait! {
|
|||
fn eq<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [EqFuture<Self, S>]
|
||||
) -> EqFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Sized + Stream,
|
||||
|
@ -2134,7 +2133,7 @@ extension_trait! {
|
|||
fn gt<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [GtFuture<Self, S>]
|
||||
) -> GtFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Stream,
|
||||
|
@ -2171,7 +2170,7 @@ extension_trait! {
|
|||
fn le<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [LeFuture<Self, S>]
|
||||
) -> LeFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Stream,
|
||||
|
@ -2208,7 +2207,7 @@ extension_trait! {
|
|||
fn lt<S>(
|
||||
self,
|
||||
other: S
|
||||
) -> [LtFuture<Self, S>]
|
||||
) -> LtFuture<Self, S>
|
||||
where
|
||||
Self: Sized + Stream,
|
||||
S: Stream,
|
||||
|
@ -2252,7 +2251,7 @@ extension_trait! {
|
|||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn sum<'a, S>(
|
||||
self,
|
||||
) -> [Pin<Box<dyn Future<Output = S> + 'a>>]
|
||||
) -> Pin<Box<dyn Future<Output = S> + 'a>>
|
||||
where
|
||||
Self: Sized + Stream<Item = S> + 'a,
|
||||
S: Sum<Self::Item>,
|
||||
|
@ -2298,7 +2297,7 @@ extension_trait! {
|
|||
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
|
||||
fn product<'a, P>(
|
||||
self,
|
||||
) -> [Pin<Box<dyn Future<Output = P> + 'a>>]
|
||||
) -> Pin<Box<dyn Future<Output = P> + 'a>>
|
||||
where
|
||||
Self: Sized + Stream<Item = P> + 'a,
|
||||
P: Product,
|
||||
|
@ -2306,7 +2305,6 @@ extension_trait! {
|
|||
Product::product(self)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Stream + ?Sized> StreamExt for T {}
|
||||
|
||||
|
|
38
src/utils.rs
38
src/utils.rs
|
@ -233,41 +233,3 @@ macro_rules! cfg_default {
|
|||
)*
|
||||
}
|
||||
}
|
||||
|
||||
/// Defines an extension trait for a base trait.
|
||||
///
|
||||
/// In generated docs, the base trait will contain methods from the extension trait. In actual
|
||||
/// code, the base trait will be re-exported and the extension trait will be hidden. We then
|
||||
/// re-export the extension trait from the prelude.
|
||||
///
|
||||
/// Inside invocations of this macro, we write a definitions that looks similar to the final
|
||||
/// rendered docs, and the macro then generates all the boilerplate for us.
|
||||
#[allow(unused_macros)]
|
||||
#[doc(hidden)]
|
||||
macro_rules! extension_trait {
|
||||
(
|
||||
#[doc = $doc_ext:tt]
|
||||
pub trait $ext:ident: $name:ident {
|
||||
$($body_ext:tt)*
|
||||
}
|
||||
) => {
|
||||
// The extension trait that adds methods to any type implementing the base trait.
|
||||
#[doc = $doc_ext]
|
||||
pub trait $ext: $name {
|
||||
extension_trait!(@ext [$($body_ext)*] -> []);
|
||||
}
|
||||
};
|
||||
|
||||
// Parse the return type in an extension method.
|
||||
(@ext [-> [$f:ty] $($tail:tt)*] -> [$($accum:tt)*]) => {
|
||||
extension_trait!(@ext [$($tail)*] -> [$($accum)* -> $f]);
|
||||
};
|
||||
|
||||
// Parse a token.
|
||||
(@ext [$token:tt $($tail:tt)*] -> [$($accum:tt)*]) => {
|
||||
extension_trait!(@ext [$($tail)*] -> [$($accum)* $token]);
|
||||
};
|
||||
|
||||
// Handle the end of the token list.
|
||||
(@ext [] -> [$($accum:tt)*]) => { $($accum)* };
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue