pub struct RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF = TokioSleeper, RF = fn(&E) -> bool, NF = fn(&E, Duration)>where
B: Backoff,
Fut: Future<Output = (Ctx, Result<T, E>)>,
FutureFn: FnMut(Ctx) -> Fut,
SF: MaybeSleeper,{ /* private fields */ }Expand description
Retry struct generated by RetryableWithContext.
Implementations§
Source§impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
Sourcepub fn sleep<SN>(
self,
sleep_fn: SN,
) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SN, RF, NF> ⓘwhere
SN: Sleeper,
pub fn sleep<SN>(
self,
sleep_fn: SN,
) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SN, RF, NF> ⓘwhere
SN: Sleeper,
Set the sleeper for retrying.
The sleeper should implement the Sleeper trait. The simplest way is to use a closure that returns a Future.
If not specified, we use the DefaultSleeper.
Sourcepub fn context(
self,
context: Ctx,
) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> ⓘ
pub fn context( self, context: Ctx, ) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> ⓘ
Set the context for retrying.
Context is used to capture ownership manually to prevent lifetime issues.
Sourcepub fn when<RN>(
self,
retryable: RN,
) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RN, NF> ⓘ
pub fn when<RN>( self, retryable: RN, ) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RN, NF> ⓘ
Set the conditions for retrying.
If not specified, all errors are considered retryable.
§Examples
use anyhow::Result;
use backon::ExponentialBuilder;
use backon::Retryable;
async fn fetch() -> Result<String> {
Ok(reqwest::get("https://www.rust-lang.org")
.await?
.text()
.await?)
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
let content = fetch
.retry(ExponentialBuilder::default())
.when(|e| e.to_string() == "EOF")
.await?;
println!("fetch succeeded: {}", content);
Ok(())
}Sourcepub fn notify<NN>(
self,
notify: NN,
) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NN> ⓘ
pub fn notify<NN>( self, notify: NN, ) -> RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NN> ⓘ
Set to notify for all retry attempts.
When a retry happens, the input function will be invoked with the error and the sleep duration before pausing.
If not specified, this operation does nothing.
§Examples
use core::time::Duration;
use anyhow::Result;
use backon::ExponentialBuilder;
use backon::Retryable;
async fn fetch() -> Result<String> {
Ok(reqwest::get("https://www.rust-lang.org")
.await?
.text()
.await?)
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
let content = fetch
.retry(ExponentialBuilder::default())
.notify(|err: &anyhow::Error, dur: Duration| {
println!("retrying error {:?} with sleeping {:?}", err, dur);
})
.await?;
println!("fetch succeeded: {}", content);
Ok(())
}Trait Implementations§
Source§impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> Future for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> Future for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
Source§fn poll(
self: Pin<&mut RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>>,
cx: &mut Context<'_>,
) -> Poll<<RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> as Future>::Output>
fn poll( self: Pin<&mut RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>>, cx: &mut Context<'_>, ) -> Poll<<RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> as Future>::Output>
Attempts to resolve the future to a final value, registering
the current task for wakeup if the value is not yet available. Read more
Auto Trait Implementations§
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> Freeze for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> RefUnwindSafe for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>where
B: RefUnwindSafe,
RF: RefUnwindSafe,
NF: RefUnwindSafe,
FutureFn: RefUnwindSafe,
SF: RefUnwindSafe,
Fut: RefUnwindSafe,
Ctx: RefUnwindSafe,
<SF as MaybeSleeper>::Sleep: RefUnwindSafe,
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> Send for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> Sync for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> Unpin for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>
impl<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF> UnwindSafe for RetryWithContext<B, T, E, Ctx, Fut, FutureFn, SF, RF, NF>where
B: UnwindSafe,
RF: UnwindSafe,
NF: UnwindSafe,
FutureFn: UnwindSafe,
SF: UnwindSafe,
Fut: UnwindSafe,
Ctx: UnwindSafe,
<SF as MaybeSleeper>::Sleep: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_cancellation_token(
self,
cancellation_token: &CancellationToken,
) -> WithCancellationTokenFuture<'_, Self>where
Self: Sized,
fn with_cancellation_token(
self,
cancellation_token: &CancellationToken,
) -> WithCancellationTokenFuture<'_, Self>where
Self: Sized,
Similar to
CancellationToken::run_until_cancelled,
but with the advantage that it is easier to write fluent call chains. Read moreSource§fn with_cancellation_token_owned(
self,
cancellation_token: CancellationToken,
) -> WithCancellationTokenFutureOwned<Self>where
Self: Sized,
fn with_cancellation_token_owned(
self,
cancellation_token: CancellationToken,
) -> WithCancellationTokenFutureOwned<Self>where
Self: Sized,
Similar to
CancellationToken::run_until_cancelled_owned,
but with the advantage that it is easier to write fluent call chains. Read moreSource§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn map<U, F>(self, f: F) -> Map<Self, F>
fn map<U, F>(self, f: F) -> Map<Self, F>
Map this future’s output to a different type, returning a new future of
the resulting type. Read more
Source§fn map_into<U>(self) -> MapInto<Self, U>
fn map_into<U>(self) -> MapInto<Self, U>
Map this future’s output to a different type, returning a new future of
the resulting type. Read more
Source§fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
Chain on a computation for when a future finished, passing the result of
the future to the provided closure
f. Read moreSource§fn left_future<B>(self) -> Either<Self, B>
fn left_future<B>(self) -> Either<Self, B>
Source§fn right_future<A>(self) -> Either<A, Self>
fn right_future<A>(self) -> Either<A, Self>
Source§fn into_stream(self) -> IntoStream<Self>where
Self: Sized,
fn into_stream(self) -> IntoStream<Self>where
Self: Sized,
Convert this future into a single element stream. Read more
Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Flatten the execution of this future when the output of this
future is itself another future. Read more
Source§fn flatten_stream(self) -> FlattenStream<Self>
fn flatten_stream(self) -> FlattenStream<Self>
Flatten the execution of this future when the successful result of this
future is a stream. Read more
Source§fn fuse(self) -> Fuse<Self>where
Self: Sized,
fn fuse(self) -> Fuse<Self>where
Self: Sized,
Fuse a future such that
poll will never again be called once it has
completed. This method can be used to turn any Future into a
FusedFuture. Read moreSource§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
Do something with the output of a future before passing it on. Read more
Source§fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
Wrap the future in a Box, pinning it. Read more
Source§fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>where
Self: Sized + 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>where
Self: Sized + 'a,
Wrap the future in a Box, pinning it. Read more
Source§fn unit_error(self) -> UnitError<Self>where
Self: Sized,
fn unit_error(self) -> UnitError<Self>where
Self: Sized,
Turns a
Future<Output = T> into a
TryFuture<Ok = T, Error = ()>.Source§fn never_error(self) -> NeverError<Self>where
Self: Sized,
fn never_error(self) -> NeverError<Self>where
Self: Sized,
Turns a
Future<Output = T> into a
TryFuture<Ok = T, Error = Never>.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<F> IntoFuture for Fwhere
F: Future,
impl<F> IntoFuture for Fwhere
F: Future,
Source§type IntoFuture = F
type IntoFuture = F
Which kind of future are we turning this into?
Source§fn into_future(self) -> <F as IntoFuture>::IntoFuture
fn into_future(self) -> <F as IntoFuture>::IntoFuture
Creates a future from a value. Read more
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::Request