use crate::body::{self, buffered, credit, flow, ingress, stream};
unsafe impl<O: credit::Origin> credit::raw::Bind for credit::Release<O> {
type Origin = O;
type Bound<Q: credit::Origin> = credit::Release<Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
credit::Release::new(self.amount, origin)
}
}
unsafe impl<O: credit::Origin> credit::raw::Bind for ingress::State<O> {
type Origin = O;
type Bound<Q: credit::Origin> = ingress::State<Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
ingress::State {
track: self.track,
credit: self.credit,
origin,
}
}
}
unsafe impl<O: credit::Origin> credit::raw::Bind for ingress::Finished<O> {
type Origin = O;
type Bound<Q: credit::Origin> = ingress::Finished<Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
ingress::Finished {
state: unsafe { self.state.bind(origin) },
}
}
}
unsafe impl<S, O: credit::Origin> credit::raw::Bind for buffered::State<S, O> {
type Origin = O;
type Bound<Q: credit::Origin> = buffered::State<S, Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
buffered::State {
state: unsafe { self.state.bind(origin) },
storage: self.storage,
}
}
}
unsafe impl<S, T, O: credit::Origin> credit::raw::Bind for buffered::Rejected<S, T, O> {
type Origin = O;
type Bound<Q: credit::Origin> = buffered::Rejected<S, T, Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
match self {
Self::Admission { state, error } => buffered::Rejected::Admission {
state: unsafe { state.bind(origin) },
error,
},
Self::Storage { failure, release } => buffered::Rejected::Storage {
failure,
release: unsafe { release.bind(origin) },
},
Self::Credit {
body,
release,
error,
} => buffered::Rejected::Credit {
body,
release: unsafe { release.bind(origin) },
error,
},
}
}
}
unsafe impl<'d, B: body::Build<'d>, O: credit::Origin> credit::raw::Bind
for stream::Stream<'d, B, O>
{
type Origin = O;
type Bound<Q: credit::Origin> = stream::Stream<'d, B, Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
stream::Stream::from_parts(unsafe { self.state.bind(origin) }, self.flow)
}
}
unsafe impl<'d, B: body::Build<'d>, O: credit::Origin> credit::raw::Bind for flow::Ready<'d, B, O> {
type Origin = O;
type Bound<Q: credit::Origin> = flow::Ready<'d, B, Q>;
unsafe fn bind<Q: credit::Origin>(self, origin: Q) -> Self::Bound<Q> {
flow::Ready {
state: unsafe { self.state.bind(origin) },
output: self.output,
lifetime: self.lifetime,
}
}
}