6#include <unordered_map>
8#include <userver/components/component_base.hpp>
9#include <userver/components/component_fwd.hpp>
10#include <userver/utils/meta_light.hpp>
11#include <userver/yaml_config/fwd.hpp>
13#include <userver/middlewares/impl/middleware_pipeline_config.hpp>
15USERVER_NAMESPACE_BEGIN
20namespace middlewares {
26enum class DependencyType {
26enum class DependencyType {
…};
34 std::string node_name{};
35 DependencyType type{DependencyType::kStrong};
38struct MiddlewareDependency
final {
39 std::string middleware_name{};
40 std::vector<Connect> befores{};
41 std::vector<Connect> afters{};
43 std::optional<std::string> group{};
46using Dependencies = std::unordered_map<std::string, MiddlewareDependency>;
48class MiddlewarePipeline
final {
50 explicit MiddlewarePipeline(Dependencies&& deps);
52 std::vector<std::string> GetPerServiceMiddlewares(
const MiddlewareRunnerConfig& config)
const;
54 const MiddlewareOrderedList& GetOrderedList()
const {
return pipeline_; }
58 MiddlewareOrderedList pipeline_{};
61template <
typename Group>
62std::string BeginOfGroup() {
63 return std::string{Group::kName} +
"#begin";
66template <
typename Group>
67std::string EndOfGroup() {
68 return std::string{Group::kName} +
"#end";
84 AnyMiddlewarePipelineComponent(
87 impl::BasePipelineConfig&& base_config
94 const impl::MiddlewarePipeline& GetPipeline()
const;
98 impl::MiddlewarePipeline pipeline_;
109class MiddlewareDependencyBuilder
final {
112 MiddlewareDependencyBuilder() =
default;
114 MiddlewareDependencyBuilder(
const MiddlewareDependencyBuilder&) =
default;
115 MiddlewareDependencyBuilder(MiddlewareDependencyBuilder&&)
noexcept =
default;
116 MiddlewareDependencyBuilder& operator=(
const MiddlewareDependencyBuilder&) =
default;
117 MiddlewareDependencyBuilder& operator=(MiddlewareDependencyBuilder&&) =
default;
121 template <
typename MiddlewareBefore>
122 MiddlewareDependencyBuilder Before(DependencyType type = DependencyType::kStrong) &&;
127 MiddlewareDependencyBuilder Before(std::string_view before, DependencyType type = DependencyType::kStrong) &&;
131 template <
typename MiddlewareAfter>
132 MiddlewareDependencyBuilder After(DependencyType type = DependencyType::kStrong) &&;
137 MiddlewareDependencyBuilder After(std::string_view after, DependencyType type = DependencyType::kStrong) &&;
140 template <
typename Group>
141 MiddlewareDependencyBuilder InGroup() &&;
145 impl::MiddlewareDependency ExtractDependency(std::string_view middleware_name) &&;
146 impl::MiddlewareDependency ExtractGroupDependency(std::string_view group_name) &&;
150 void InUserGroupByDefault();
152 impl::MiddlewareDependency dep_{};
109class MiddlewareDependencyBuilder
final {
…};
158using IsGroup =
decltype(T::kDependency);
161constexpr bool kIsGroup = std::is_same_v<meta::DetectedType<IsGroup, T>,
const MiddlewareDependencyBuilder>;
165template <
typename MiddlewareBefore>
166MiddlewareDependencyBuilder MiddlewareDependencyBuilder::Before(DependencyType type) && {
167 if constexpr (impl::kIsGroup<MiddlewareBefore>) {
168 return std::move(*
this).Before(impl::BeginOfGroup<MiddlewareBefore>(), type);
170 return std::move(*
this).Before(MiddlewareBefore::kName, type);
166MiddlewareDependencyBuilder MiddlewareDependencyBuilder::Before(DependencyType type) && {
…}
173template <
typename MiddlewareAfter>
174MiddlewareDependencyBuilder MiddlewareDependencyBuilder::After(DependencyType type) && {
175 if constexpr (impl::kIsGroup<MiddlewareAfter>) {
176 return std::move(*
this).After(impl::EndOfGroup<MiddlewareAfter>(), type);
178 return std::move(*
this).After(MiddlewareAfter::kName, type);
174MiddlewareDependencyBuilder MiddlewareDependencyBuilder::After(DependencyType type) && {
…}
181template <
typename Group>
182MiddlewareDependencyBuilder MiddlewareDependencyBuilder::InGroup() && {
183 dep_.group = Group::kName;
184 dep_.afters.push_back(impl::Connect{impl::BeginOfGroup<Group>(), DependencyType::kStrong});
185 return std::move(*
this).Before(impl::EndOfGroup<Group>(), DependencyType::kWeak);
182MiddlewareDependencyBuilder MiddlewareDependencyBuilder::InGroup() && {
…}