summaryrefslogtreecommitdiff
path: root/vendor/tower-layer
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-15 16:37:08 -0600
committermo khan <mo@mokhan.ca>2025-07-17 16:30:22 -0600
commit45df4d0d9b577fecee798d672695fe24ff57fb1b (patch)
tree1b99bf645035b58e0d6db08c7a83521f41f7a75b /vendor/tower-layer
parentf94f79608393d4ab127db63cc41668445ef6b243 (diff)
feat: migrate from Cedar to SpiceDB authorization system
This is a major architectural change that replaces the Cedar policy-based authorization system with SpiceDB's relation-based authorization. Key changes: - Migrate from Rust to Go implementation - Replace Cedar policies with SpiceDB schema and relationships - Switch from envoy `ext_authz` with Cedar to SpiceDB permission checks - Update build system and dependencies for Go ecosystem - Maintain Envoy integration for external authorization This change enables more flexible permission modeling through SpiceDB's Google Zanzibar inspired relation-based system, supporting complex hierarchical permissions that were difficult to express in Cedar. Breaking change: Existing Cedar policies and Rust-based configuration will no longer work and need to be migrated to SpiceDB schema.
Diffstat (limited to 'vendor/tower-layer')
-rw-r--r--vendor/tower-layer/.cargo-checksum.json1
-rw-r--r--vendor/tower-layer/CHANGELOG.md48
-rw-r--r--vendor/tower-layer/Cargo.toml41
-rw-r--r--vendor/tower-layer/LICENSE25
-rw-r--r--vendor/tower-layer/README.md43
-rw-r--r--vendor/tower-layer/src/identity.rs37
-rw-r--r--vendor/tower-layer/src/layer_fn.rs114
-rw-r--r--vendor/tower-layer/src/lib.rs112
-rw-r--r--vendor/tower-layer/src/stack.rs62
-rw-r--r--vendor/tower-layer/src/tuple.rs330
10 files changed, 0 insertions, 813 deletions
diff --git a/vendor/tower-layer/.cargo-checksum.json b/vendor/tower-layer/.cargo-checksum.json
deleted file mode 100644
index 79190233..00000000
--- a/vendor/tower-layer/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"CHANGELOG.md":"8e388c285cf1f52b986862cde65a188002d1d223ffa04ce28fb669fe935f61a9","Cargo.toml":"294873d3652f2c23fd4839dffec4edfc3372345a2dd2cec898da4a9fb0b0c1c5","LICENSE":"4249c8e6c5ebb85f97c77e6457c6fafc1066406eb8f1ef61e796fbdc5ff18482","README.md":"224c67c67c5cbdbfd6f46a0ef4833a09798c4edb7faffaf3c549bec7f4780173","src/identity.rs":"f52f535dd6fbe5da1e63da9cf6bbaaf16bb882da9008676570489b3bc6410673","src/layer_fn.rs":"bee7fb3ad2d016fea7fd47b298677b74d30cd459f019fa2d74940a6cc2237ddb","src/lib.rs":"4124a66bc533f64d67b44e98d1782104aa85b85a64638ab42f94319a0ff00812","src/stack.rs":"572ccc3b4d1111db007b7a573f31ac03efbd9b07ef8fec8d16ee34e9da299124","src/tuple.rs":"420dc53fbde5a4c213a2a70bce6ae755953b7fbddd1e895d6f4d62e2591ae466"},"package":"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"} \ No newline at end of file
diff --git a/vendor/tower-layer/CHANGELOG.md b/vendor/tower-layer/CHANGELOG.md
deleted file mode 100644
index 1ca7a54b..00000000
--- a/vendor/tower-layer/CHANGELOG.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# 0.3.3 (August 1, 2024)
-
-### Added
-
-- **builder,util**: add convenience methods for boxing services ([#616])
-- **all**: new functions const when possible ([#760])
-
-[#616]: https://github.com/tower-rs/tower/pull/616
-[#760]: https://github.com/tower-rs/tower/pull/760
-
-# 0.3.2 (Octpber 10, 2022)
-
-## Added
-
-- Implement `Layer` for tuples of up to 16 elements ([#694])
-
-[#694]: https://github.com/tower-rs/tower/pull/694
-
-# 0.3.1 (January 7, 2021)
-
-### Added
-
-- Added `layer_fn`, for constructing a `Layer` from a function taking
- a `Service` and returning a different `Service` ([#491])
-- Added an implementation of `Layer` for `&Layer` ([#446])
-- Multiple documentation improvements ([#487], [#490])
-
-[#491]: https://github.com/tower-rs/tower/pull/491
-[#446]: https://github.com/tower-rs/tower/pull/446
-[#487]: https://github.com/tower-rs/tower/pull/487
-[#490]: https://github.com/tower-rs/tower/pull/490
-
-# 0.3.0 (November 29, 2019)
-
-- Move layer builder from `tower-util` to tower-layer.
-
-# 0.3.0-alpha.2 (September 30, 2019)
-
-- Move to `futures-*-preview 0.3.0-alpha.19`
-- Move to `pin-project 0.4`
-
-# 0.3.0-alpha.1 (September 11, 2019)
-
-- Move to `std::future`
-
-# 0.1.0 (April 26, 2019)
-
-- Initial release
diff --git a/vendor/tower-layer/Cargo.toml b/vendor/tower-layer/Cargo.toml
deleted file mode 100644
index b8b9d75e..00000000
--- a/vendor/tower-layer/Cargo.toml
+++ /dev/null
@@ -1,41 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2018"
-name = "tower-layer"
-version = "0.3.3"
-authors = ["Tower Maintainers <team@tower-rs.com>"]
-build = false
-autobins = false
-autoexamples = false
-autotests = false
-autobenches = false
-description = """
-Decorates a `Service` to allow easy composition between `Service`s.
-"""
-homepage = "https://github.com/tower-rs/tower"
-documentation = "https://docs.rs/tower-layer/0.3.3"
-readme = "README.md"
-categories = [
- "asynchronous",
- "network-programming",
-]
-license = "MIT"
-repository = "https://github.com/tower-rs/tower"
-
-[lib]
-name = "tower_layer"
-path = "src/lib.rs"
-
-[dependencies]
-
-[dev-dependencies]
diff --git a/vendor/tower-layer/LICENSE b/vendor/tower-layer/LICENSE
deleted file mode 100644
index b980cacc..00000000
--- a/vendor/tower-layer/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2019 Tower Contributors
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/vendor/tower-layer/README.md b/vendor/tower-layer/README.md
deleted file mode 100644
index 48f9dbb7..00000000
--- a/vendor/tower-layer/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Tower Layer
-
-Decorates a [Tower] `Service`, transforming either the request or the response.
-
-[![Crates.io][crates-badge]][crates-url]
-[![Documentation][docs-badge]][docs-url]
-[![Documentation (master)][docs-master-badge]][docs-master-url]
-[![MIT licensed][mit-badge]][mit-url]
-[![Build Status][actions-badge]][actions-url]
-[![Discord chat][discord-badge]][discord-url]
-
-[crates-badge]: https://img.shields.io/crates/v/tower-layer.svg
-[crates-url]: https://crates.io/crates/tower-layer
-[docs-badge]: https://docs.rs/tower-layer/badge.svg
-[docs-url]: https://docs.rs/tower-layer
-[docs-master-badge]: https://img.shields.io/badge/docs-master-blue
-[docs-master-url]: https://tower-rs.github.io/tower/tower_layer
-[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
-[mit-url]: LICENSE
-[actions-badge]: https://github.com/tower-rs/tower/workflows/CI/badge.svg
-[actions-url]:https://github.com/tower-rs/tower/actions?query=workflow%3ACI
-[discord-badge]: https://img.shields.io/discord/500028886025895936?logo=discord&label=discord&logoColor=white
-[discord-url]: https://discord.gg/EeF3cQw
-
-## Overview
-
-Often, many of the pieces needed for writing network applications can be
-reused across multiple services. The `Layer` trait can be used to write
-reusable components that can be applied to very different kinds of services;
-for example, it can be applied to services operating on different protocols,
-and to both the client and server side of a network transaction.
-
-## License
-
-This project is licensed under the [MIT license](LICENSE).
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in Tower by you, shall be licensed as MIT, without any additional
-terms or conditions.
-
-[Tower]: https://crates.io/crates/tower \ No newline at end of file
diff --git a/vendor/tower-layer/src/identity.rs b/vendor/tower-layer/src/identity.rs
deleted file mode 100644
index 5233a1d8..00000000
--- a/vendor/tower-layer/src/identity.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-use super::Layer;
-use std::fmt;
-
-/// A no-op middleware.
-///
-/// When wrapping a [`Service`], the [`Identity`] layer returns the provided
-/// service without modifying it.
-///
-/// [`Service`]: https://docs.rs/tower-service/latest/tower_service/trait.Service.html
-#[derive(Default, Clone)]
-pub struct Identity {
- _p: (),
-}
-
-impl Identity {
- /// Create a new [`Identity`] value
- pub const fn new() -> Identity {
- Identity { _p: () }
- }
-}
-
-/// Decorates a [`Service`], transforming either the request or the response.
-///
-/// [`Service`]: https://docs.rs/tower-service/latest/tower_service/trait.Service.html
-impl<S> Layer<S> for Identity {
- type Service = S;
-
- fn layer(&self, inner: S) -> Self::Service {
- inner
- }
-}
-
-impl fmt::Debug for Identity {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("Identity").finish()
- }
-}
diff --git a/vendor/tower-layer/src/layer_fn.rs b/vendor/tower-layer/src/layer_fn.rs
deleted file mode 100644
index 06f6e0e3..00000000
--- a/vendor/tower-layer/src/layer_fn.rs
+++ /dev/null
@@ -1,114 +0,0 @@
-use super::Layer;
-use std::fmt;
-
-/// Returns a new [`LayerFn`] that implements [`Layer`] by calling the
-/// given function.
-///
-/// The [`Layer::layer`] method takes a type implementing [`Service`] and
-/// returns a different type implementing [`Service`]. In many cases, this can
-/// be implemented by a function or a closure. The [`LayerFn`] helper allows
-/// writing simple [`Layer`] implementations without needing the boilerplate of
-/// a new struct implementing [`Layer`].
-///
-/// # Example
-/// ```rust
-/// # use tower::Service;
-/// # use std::task::{Poll, Context};
-/// # use tower_layer::{Layer, layer_fn};
-/// # use std::fmt;
-/// # use std::convert::Infallible;
-/// #
-/// // A middleware that logs requests before forwarding them to another service
-/// pub struct LogService<S> {
-/// target: &'static str,
-/// service: S,
-/// }
-///
-/// impl<S, Request> Service<Request> for LogService<S>
-/// where
-/// S: Service<Request>,
-/// Request: fmt::Debug,
-/// {
-/// type Response = S::Response;
-/// type Error = S::Error;
-/// type Future = S::Future;
-///
-/// fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
-/// self.service.poll_ready(cx)
-/// }
-///
-/// fn call(&mut self, request: Request) -> Self::Future {
-/// // Log the request
-/// println!("request = {:?}, target = {:?}", request, self.target);
-///
-/// self.service.call(request)
-/// }
-/// }
-///
-/// // A `Layer` that wraps services in `LogService`
-/// let log_layer = layer_fn(|service| {
-/// LogService {
-/// service,
-/// target: "tower-docs",
-/// }
-/// });
-///
-/// // An example service. This one uppercases strings
-/// let uppercase_service = tower::service_fn(|request: String| async move {
-/// Ok::<_, Infallible>(request.to_uppercase())
-/// });
-///
-/// // Wrap our service in a `LogService` so requests are logged.
-/// let wrapped_service = log_layer.layer(uppercase_service);
-/// ```
-///
-/// [`Service`]: https://docs.rs/tower-service/latest/tower_service/trait.Service.html
-/// [`Layer::layer`]: crate::Layer::layer
-pub fn layer_fn<T>(f: T) -> LayerFn<T> {
- LayerFn { f }
-}
-
-/// A `Layer` implemented by a closure. See the docs for [`layer_fn`] for more details.
-#[derive(Clone, Copy)]
-pub struct LayerFn<F> {
- f: F,
-}
-
-impl<F, S, Out> Layer<S> for LayerFn<F>
-where
- F: Fn(S) -> Out,
-{
- type Service = Out;
-
- fn layer(&self, inner: S) -> Self::Service {
- (self.f)(inner)
- }
-}
-
-impl<F> fmt::Debug for LayerFn<F> {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("LayerFn")
- .field("f", &format_args!("{}", std::any::type_name::<F>()))
- .finish()
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[allow(dead_code)]
- #[test]
- fn layer_fn_has_useful_debug_impl() {
- struct WrappedService<S> {
- inner: S,
- }
- let layer = layer_fn(|svc| WrappedService { inner: svc });
- let _svc = layer.layer("foo");
-
- assert_eq!(
- "LayerFn { f: tower_layer::layer_fn::tests::layer_fn_has_useful_debug_impl::{{closure}} }".to_string(),
- format!("{:?}", layer),
- );
- }
-}
diff --git a/vendor/tower-layer/src/lib.rs b/vendor/tower-layer/src/lib.rs
deleted file mode 100644
index 4823fcc1..00000000
--- a/vendor/tower-layer/src/lib.rs
+++ /dev/null
@@ -1,112 +0,0 @@
-#![warn(
- missing_debug_implementations,
- missing_docs,
- rust_2018_idioms,
- unreachable_pub
-)]
-#![forbid(unsafe_code)]
-// `rustdoc::broken_intra_doc_links` is checked on CI
-
-//! Layer traits and extensions.
-//!
-//! A layer decorates an service and provides additional functionality. It
-//! allows other services to be composed with the service that implements layer.
-//!
-//! A middleware implements the [`Layer`] and [`Service`] trait.
-//!
-//! [`Service`]: https://docs.rs/tower/*/tower/trait.Service.html
-
-mod identity;
-mod layer_fn;
-mod stack;
-mod tuple;
-
-pub use self::{
- identity::Identity,
- layer_fn::{layer_fn, LayerFn},
- stack::Stack,
-};
-
-/// Decorates a [`Service`], transforming either the request or the response.
-///
-/// Often, many of the pieces needed for writing network applications can be
-/// reused across multiple services. The `Layer` trait can be used to write
-/// reusable components that can be applied to very different kinds of services;
-/// for example, it can be applied to services operating on different protocols,
-/// and to both the client and server side of a network transaction.
-///
-/// # Log
-///
-/// Take request logging as an example:
-///
-/// ```rust
-/// # use tower_service::Service;
-/// # use std::task::{Poll, Context};
-/// # use tower_layer::Layer;
-/// # use std::fmt;
-///
-/// pub struct LogLayer {
-/// target: &'static str,
-/// }
-///
-/// impl<S> Layer<S> for LogLayer {
-/// type Service = LogService<S>;
-///
-/// fn layer(&self, service: S) -> Self::Service {
-/// LogService {
-/// target: self.target,
-/// service
-/// }
-/// }
-/// }
-///
-/// // This service implements the Log behavior
-/// pub struct LogService<S> {
-/// target: &'static str,
-/// service: S,
-/// }
-///
-/// impl<S, Request> Service<Request> for LogService<S>
-/// where
-/// S: Service<Request>,
-/// Request: fmt::Debug,
-/// {
-/// type Response = S::Response;
-/// type Error = S::Error;
-/// type Future = S::Future;
-///
-/// fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
-/// self.service.poll_ready(cx)
-/// }
-///
-/// fn call(&mut self, request: Request) -> Self::Future {
-/// // Insert log statement here or other functionality
-/// println!("request = {:?}, target = {:?}", request, self.target);
-/// self.service.call(request)
-/// }
-/// }
-/// ```
-///
-/// The above log implementation is decoupled from the underlying protocol and
-/// is also decoupled from client or server concerns. In other words, the same
-/// log middleware could be used in either a client or a server.
-///
-/// [`Service`]: https://docs.rs/tower/*/tower/trait.Service.html
-pub trait Layer<S> {
- /// The wrapped service
- type Service;
- /// Wrap the given service with the middleware, returning a new service
- /// that has been decorated with the middleware.
- fn layer(&self, inner: S) -> Self::Service;
-}
-
-impl<'a, T, S> Layer<S> for &'a T
-where
- T: ?Sized + Layer<S>,
-{
- type Service = T::Service;
-
- fn layer(&self, inner: S) -> Self::Service {
- (**self).layer(inner)
- }
-}
diff --git a/vendor/tower-layer/src/stack.rs b/vendor/tower-layer/src/stack.rs
deleted file mode 100644
index cb6bac7b..00000000
--- a/vendor/tower-layer/src/stack.rs
+++ /dev/null
@@ -1,62 +0,0 @@
-use super::Layer;
-use std::fmt;
-
-/// Two middlewares chained together.
-#[derive(Clone)]
-pub struct Stack<Inner, Outer> {
- inner: Inner,
- outer: Outer,
-}
-
-impl<Inner, Outer> Stack<Inner, Outer> {
- /// Create a new `Stack`.
- pub const fn new(inner: Inner, outer: Outer) -> Self {
- Stack { inner, outer }
- }
-}
-
-impl<S, Inner, Outer> Layer<S> for Stack<Inner, Outer>
-where
- Inner: Layer<S>,
- Outer: Layer<Inner::Service>,
-{
- type Service = Outer::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let inner = self.inner.layer(service);
-
- self.outer.layer(inner)
- }
-}
-
-impl<Inner, Outer> fmt::Debug for Stack<Inner, Outer>
-where
- Inner: fmt::Debug,
- Outer: fmt::Debug,
-{
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- // The generated output of nested `Stack`s is very noisy and makes
- // it harder to understand what is in a `ServiceBuilder`.
- //
- // Instead, this output is designed assuming that a `Stack` is
- // usually quite nested, and inside a `ServiceBuilder`. Therefore,
- // this skips using `f.debug_struct()`, since each one would force
- // a new layer of indentation.
- //
- // - In compact mode, a nested stack ends up just looking like a flat
- // list of layers.
- //
- // - In pretty mode, while a newline is inserted between each layer,
- // the `DebugStruct` used in the `ServiceBuilder` will inject padding
- // to that each line is at the same indentation level.
- //
- // Also, the order of [outer, inner] is important, since it reflects
- // the order that the layers were added to the stack.
- if f.alternate() {
- // pretty
- write!(f, "{:#?},\n{:#?}", self.outer, self.inner)
- } else {
- write!(f, "{:?}, {:?}", self.outer, self.inner)
- }
- }
-}
diff --git a/vendor/tower-layer/src/tuple.rs b/vendor/tower-layer/src/tuple.rs
deleted file mode 100644
index 14b973ab..00000000
--- a/vendor/tower-layer/src/tuple.rs
+++ /dev/null
@@ -1,330 +0,0 @@
-use crate::Layer;
-
-impl<S> Layer<S> for () {
- type Service = S;
-
- fn layer(&self, service: S) -> Self::Service {
- service
- }
-}
-
-impl<S, L1> Layer<S> for (L1,)
-where
- L1: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1,) = self;
- l1.layer(service)
- }
-}
-
-impl<S, L1, L2> Layer<S> for (L1, L2)
-where
- L1: Layer<L2::Service>,
- L2: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2) = self;
- l1.layer(l2.layer(service))
- }
-}
-
-impl<S, L1, L2, L3> Layer<S> for (L1, L2, L3)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3) = self;
- l1.layer((l2, l3).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4> Layer<S> for (L1, L2, L3, L4)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4) = self;
- l1.layer((l2, l3, l4).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5> Layer<S> for (L1, L2, L3, L4, L5)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5) = self;
- l1.layer((l2, l3, l4, l5).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6> Layer<S> for (L1, L2, L3, L4, L5, L6)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6) = self;
- l1.layer((l2, l3, l4, l5, l6).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7> Layer<S> for (L1, L2, L3, L4, L5, L6, L7)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7) = self;
- l1.layer((l2, l3, l4, l5, l6, l7).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9> Layer<S> for (L1, L2, L3, L4, L5, L6, L7, L8, L9)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<L11::Service>,
- L11: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<L11::Service>,
- L11: Layer<L12::Service>,
- L12: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<L11::Service>,
- L11: Layer<L12::Service>,
- L12: Layer<L13::Service>,
- L13: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13).layer(service))
- }
-}
-
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<L11::Service>,
- L11: Layer<L12::Service>,
- L12: Layer<L13::Service>,
- L13: Layer<L14::Service>,
- L14: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14).layer(service))
- }
-}
-
-#[rustfmt::skip]
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<L11::Service>,
- L11: Layer<L12::Service>,
- L12: Layer<L13::Service>,
- L13: Layer<L14::Service>,
- L14: Layer<L15::Service>,
- L15: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15).layer(service))
- }
-}
-
-#[rustfmt::skip]
-impl<S, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16> Layer<S>
- for (L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16)
-where
- L1: Layer<L2::Service>,
- L2: Layer<L3::Service>,
- L3: Layer<L4::Service>,
- L4: Layer<L5::Service>,
- L5: Layer<L6::Service>,
- L6: Layer<L7::Service>,
- L7: Layer<L8::Service>,
- L8: Layer<L9::Service>,
- L9: Layer<L10::Service>,
- L10: Layer<L11::Service>,
- L11: Layer<L12::Service>,
- L12: Layer<L13::Service>,
- L13: Layer<L14::Service>,
- L14: Layer<L15::Service>,
- L15: Layer<L16::Service>,
- L16: Layer<S>,
-{
- type Service = L1::Service;
-
- fn layer(&self, service: S) -> Self::Service {
- let (l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16) = self;
- l1.layer((l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16).layer(service))
- }
-}