use super::{Error, Input, InterceptorContext, Output};
use crate::client::interceptors::context::{Request, Response};
use crate::client::orchestrator::OrchestratorError;
use std::fmt::Debug;
macro_rules! impl_from_interceptor_context {
(ref $wrapper:ident) => {
impl<'a, I, O, E> From<&'a InterceptorContext<I, O, E>> for $wrapper<'a, I, O, E> {
fn from(inner: &'a InterceptorContext<I, O, E>) -> Self {
Self { inner }
}
}
};
(mut $wrapper:ident) => {
impl<'a, I, O, E> From<&'a mut InterceptorContext<I, O, E>> for $wrapper<'a, I, O, E> {
fn from(inner: &'a mut InterceptorContext<I, O, E>) -> Self {
Self { inner }
}
}
};
}
macro_rules! expect {
($self:ident, $what:ident) => {
$self.inner.$what().expect(concat!(
"`",
stringify!($what),
"` wasn't set in the underlying interceptor context. This is a bug."
))
};
}
#[derive(Debug)]
pub struct BeforeSerializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> {
inner: &'a InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(ref BeforeSerializationInterceptorContextRef);
impl<I, O, E> BeforeSerializationInterceptorContextRef<'_, I, O, E> {
pub fn input(&self) -> &I {
expect!(self, input)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
}
#[derive(Debug)]
pub struct BeforeSerializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> {
inner: &'a mut InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(mut BeforeSerializationInterceptorContextMut);
impl<I, O, E> BeforeSerializationInterceptorContextMut<'_, I, O, E> {
pub fn input(&self) -> &I {
expect!(self, input)
}
pub fn input_mut(&mut self) -> &mut I {
expect!(self, input_mut)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {
self.inner
}
}
#[derive(Debug)]
pub struct BeforeTransmitInterceptorContextRef<'a, I = Input, O = Output, E = Error> {
inner: &'a InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(ref BeforeTransmitInterceptorContextRef);
impl<I, O, E> BeforeTransmitInterceptorContextRef<'_, I, O, E> {
pub fn request(&self) -> &Request {
expect!(self, request)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
}
#[derive(Debug)]
pub struct BeforeTransmitInterceptorContextMut<'a, I = Input, O = Output, E = Error> {
inner: &'a mut InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(mut BeforeTransmitInterceptorContextMut);
impl<I, O, E> BeforeTransmitInterceptorContextMut<'_, I, O, E> {
pub fn request(&self) -> &Request {
expect!(self, request)
}
pub fn request_mut(&mut self) -> &mut Request {
expect!(self, request_mut)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {
self.inner
}
}
#[derive(Debug)]
pub struct BeforeDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> {
inner: &'a InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(ref BeforeDeserializationInterceptorContextRef);
impl<I, O, E> BeforeDeserializationInterceptorContextRef<'_, I, O, E> {
pub fn response(&self) -> &Response {
expect!(self, response)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
}
pub struct BeforeDeserializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> {
inner: &'a mut InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(mut BeforeDeserializationInterceptorContextMut);
impl<I, O, E> BeforeDeserializationInterceptorContextMut<'_, I, O, E> {
pub fn response(&self) -> &Response {
expect!(self, response)
}
pub fn response_mut(&mut self) -> &mut Response {
expect!(self, response_mut)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {
self.inner
}
}
pub struct AfterDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> {
inner: &'a InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(ref AfterDeserializationInterceptorContextRef);
impl<I, O, E> AfterDeserializationInterceptorContextRef<'_, I, O, E> {
pub fn response(&self) -> &Response {
expect!(self, response)
}
pub fn output_or_error(&self) -> Result<&O, &OrchestratorError<E>> {
expect!(self, output_or_error)
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
}
pub struct FinalizerInterceptorContextRef<'a, I = Input, O = Output, E = Error> {
inner: &'a InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(ref FinalizerInterceptorContextRef);
impl<I, O, E> FinalizerInterceptorContextRef<'_, I, O, E> {
pub fn input(&self) -> Option<&I> {
self.inner.input.as_ref()
}
pub fn request(&self) -> Option<&Request> {
self.inner.request.as_ref()
}
pub fn response(&self) -> Option<&Response> {
self.inner.response.as_ref()
}
pub fn output_or_error(&self) -> Option<Result<&O, &OrchestratorError<E>>> {
self.inner.output_or_error.as_ref().map(|o| o.as_ref())
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
}
pub struct FinalizerInterceptorContextMut<'a, I = Input, O = Output, E = Error> {
inner: &'a mut InterceptorContext<I, O, E>,
}
impl_from_interceptor_context!(mut FinalizerInterceptorContextMut);
impl<I, O, E> FinalizerInterceptorContextMut<'_, I, O, E> {
pub fn input(&self) -> Option<&I> {
self.inner.input.as_ref()
}
pub fn request(&self) -> Option<&Request> {
self.inner.request.as_ref()
}
pub fn response(&self) -> Option<&Response> {
self.inner.response.as_ref()
}
pub fn output_or_error(&self) -> Option<Result<&O, &OrchestratorError<E>>> {
self.inner.output_or_error.as_ref().map(|o| o.as_ref())
}
pub fn input_mut(&mut self) -> Option<&mut I> {
self.inner.input.as_mut()
}
pub fn request_mut(&mut self) -> Option<&mut Request> {
self.inner.request.as_mut()
}
pub fn response_mut(&mut self) -> Option<&mut Response> {
self.inner.response.as_mut()
}
pub fn output_or_error_mut(&mut self) -> Option<&mut Result<O, OrchestratorError<E>>> {
self.inner.output_or_error.as_mut()
}
pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {
self.inner
}
pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {
self.inner
}
}