@@ -66,13 +66,15 @@ template <class DataType> using DataInputFactoryCb = std::function<DataInputPtr<
6666
6767/* *
6868 * Recursively constructs a MatchTree from a protobuf configuration.
69+ * @param DataType the type used as a source for DataInputs
70+ * @param ActionFactoryContext the context provided to Action factories
6971 */
70- template <class DataType > class MatchTreeFactory {
72+ template <class DataType , class ActionFactoryContext > class MatchTreeFactory {
7173public:
72- MatchTreeFactory (const std::string& stats_prefix ,
73- Server::Configuration::FactoryContext& factory_context ,
74+ MatchTreeFactory (ActionFactoryContext& context ,
75+ ProtobufMessage::ValidationVisitor& proto_validation_visitor ,
7476 MatchTreeValidationVisitor<DataType>& validation_visitor)
75- : stats_prefix_(stats_prefix ), factory_context_(factory_context ),
77+ : action_factory_context_(context ), proto_validation_visitor_(proto_validation_visitor ),
7678 validation_visitor_ (validation_visitor) {}
7779
7880 MatchTreeFactoryCb<DataType> create (const envoy::config::common::matcher::v3::Matcher& config) {
@@ -200,12 +202,13 @@ template <class DataType> class MatchTreeFactory {
200202 return OnMatch<DataType>{{}, matcher_factory ()};
201203 };
202204 } else if (on_match.has_action ()) {
203- auto & factory = Config::Utility::getAndCheckFactory<ActionFactory>(on_match.action ());
205+ auto & factory = Config::Utility::getAndCheckFactory<ActionFactory<ActionFactoryContext>>(
206+ on_match.action ());
204207 ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig (
205- on_match.action ().typed_config (), factory_context_. messageValidationVisitor () , factory);
208+ on_match.action ().typed_config (), proto_validation_visitor_ , factory);
206209
207- auto action_factory =
208- factory. createActionFactoryCb (*message, stats_prefix_, factory_context_ );
210+ auto action_factory = factory. createActionFactoryCb (*message, action_factory_context_,
211+ proto_validation_visitor_ );
209212 return [action_factory] { return OnMatch<DataType>{action_factory, {}}; };
210213 }
211214
@@ -234,8 +237,8 @@ template <class DataType> class MatchTreeFactory {
234237 validation_visitor_.validateDataInput (*factory, config.typed_config ().type_url ());
235238
236239 ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig (
237- config.typed_config (), factory_context_. messageValidationVisitor () , *factory);
238- auto data_input = factory->createDataInputFactoryCb (*message, factory_context_ );
240+ config.typed_config (), proto_validation_visitor_ , *factory);
241+ auto data_input = factory->createDataInputFactoryCb (*message, proto_validation_visitor_ );
239242 return data_input;
240243 }
241244
@@ -244,9 +247,9 @@ template <class DataType> class MatchTreeFactory {
244247 auto & common_input_factory =
245248 Config::Utility::getAndCheckFactory<CommonProtocolInputFactory>(config);
246249 ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig (
247- config.typed_config (), factory_context_. messageValidationVisitor () , common_input_factory);
248- auto common_input =
249- common_input_factory. createCommonProtocolInputFactoryCb ( *message, factory_context_ );
250+ config.typed_config (), proto_validation_visitor_ , common_input_factory);
251+ auto common_input = common_input_factory. createCommonProtocolInputFactoryCb (
252+ *message, proto_validation_visitor_ );
250253 return
251254 [common_input]() { return std::make_unique<CommonProtocolInputWrapper>(common_input ()); };
252255 }
@@ -265,17 +268,17 @@ template <class DataType> class MatchTreeFactory {
265268 auto & factory =
266269 Config::Utility::getAndCheckFactory<InputMatcherFactory>(predicate.custom_match ());
267270 ProtobufTypes::MessagePtr message = Config::Utility::translateAnyToFactoryConfig (
268- predicate.custom_match ().typed_config (), factory_context_.messageValidationVisitor (),
269- factory);
270- return factory.createInputMatcherFactoryCb (*message, factory_context_);
271+ predicate.custom_match ().typed_config (), proto_validation_visitor_, factory);
272+ return factory.createInputMatcherFactoryCb (*message, proto_validation_visitor_);
271273 }
272274 default :
273275 NOT_REACHED_GCOVR_EXCL_LINE;
274276 }
275277 }
276278
277279 const std::string stats_prefix_;
278- Server::Configuration::FactoryContext& factory_context_;
280+ ActionFactoryContext& action_factory_context_;
281+ ProtobufMessage::ValidationVisitor& proto_validation_visitor_;
279282 MatchTreeValidationVisitor<DataType>& validation_visitor_;
280283};
281284} // namespace Matcher
0 commit comments