use crate::operation::Operation;
use super::Plugin;
pub struct PluginStack<Inner, Outer> {
inner: Inner,
outer: Outer,
}
impl<Inner, Outer> PluginStack<Inner, Outer> {
pub fn new(inner: Inner, outer: Outer) -> Self {
PluginStack { inner, outer }
}
}
impl<P, Op, S, L, Inner, Outer> Plugin<P, Op, S, L> for PluginStack<Inner, Outer>
where
Inner: Plugin<P, Op, S, L>,
Outer: Plugin<P, Op, Inner::Service, Inner::Layer>,
{
type Service = Outer::Service;
type Layer = Outer::Layer;
fn map(&self, input: Operation<S, L>) -> Operation<Self::Service, Self::Layer> {
let inner = self.inner.map(input);
self.outer.map(inner)
}
}