1
#pragma once
2

            
3
#include "envoy/geoip/geoip_provider_driver.h"
4

            
5
#include "source/common/protobuf/protobuf.h"
6
#include "source/common/protobuf/utility.h"
7

            
8
namespace Envoy {
9
namespace Extensions {
10
namespace GeoipProviders {
11
namespace Common {
12

            
13
/**
14
 * Common base class for geoip provider factory registrations. Removes a substantial amount of
15
 * boilerplate.
16
 */
17
template <class ConfigProto> class FactoryBase : public Geolocation::GeoipProviderFactory {
18
public:
19
  // GeoipProviderFactory
20
  Geolocation::DriverSharedPtr
21
  createGeoipProviderDriver(const Protobuf::Message& config, const std::string& stat_prefix,
22
90
                            Server::Configuration::FactoryContext& context) override {
23
90
    return createGeoipProviderDriverTyped(MessageUtil::downcastAndValidate<const ConfigProto&>(
24
90
                                              config, context.messageValidationVisitor()),
25
90
                                          stat_prefix, context);
26
90
  }
27

            
28
33
  std::string name() const override { return name_; }
29

            
30
14
  std::string category() const override { return "envoy.geoip_providers"; }
31

            
32
protected:
33
20
  FactoryBase(const std::string& name) : name_(name) {}
34

            
35
private:
36
  virtual Geolocation::DriverSharedPtr
37
  createGeoipProviderDriverTyped(const ConfigProto& proto_config, const std::string& stat_prefix,
38
                                 Server::Configuration::FactoryContext& context) PURE;
39

            
40
  const std::string name_;
41
};
42

            
43
} // namespace Common
44
} // namespace GeoipProviders
45
} // namespace Extensions
46
} // namespace Envoy