1
#pragma once
2

            
3
#include "envoy/router/router.h"
4

            
5
namespace Envoy {
6
namespace Router {
7

            
8
class MetadataMatchCriteriaImpl;
9
using MetadataMatchCriteriaImplConstPtr = std::unique_ptr<const MetadataMatchCriteriaImpl>;
10

            
11
class MetadataMatchCriteriaImpl : public MetadataMatchCriteria {
12
public:
13
  MetadataMatchCriteriaImpl(const Protobuf::Struct& metadata_matches)
14
131
      : metadata_match_criteria_(extractMetadataMatchCriteria(nullptr, metadata_matches)) {};
15

            
16
  // MetadataMatchCriteria
17
4136
  const std::vector<MetadataMatchCriterionConstSharedPtr>& metadataMatchCriteria() const override {
18
4136
    return metadata_match_criteria_;
19
4136
  }
20

            
21
  MetadataMatchCriteriaConstPtr
22
27
  mergeMatchCriteria(const Protobuf::Struct& metadata_matches) const override {
23
27
    return MetadataMatchCriteriaImplConstPtr(
24
27
        new MetadataMatchCriteriaImpl(extractMetadataMatchCriteria(this, metadata_matches)));
25
27
  }
26

            
27
  MetadataMatchCriteriaConstPtr
28
  filterMatchCriteria(const std::set<std::string>& names) const override;
29

            
30
private:
31
  MetadataMatchCriteriaImpl(const std::vector<MetadataMatchCriterionConstSharedPtr>& criteria)
32
31
      : metadata_match_criteria_(criteria) {};
33

            
34
  static std::vector<MetadataMatchCriterionConstSharedPtr>
35
  extractMetadataMatchCriteria(const MetadataMatchCriteriaImpl* parent,
36
                               const Protobuf::Struct& metadata_matches);
37

            
38
  const std::vector<MetadataMatchCriterionConstSharedPtr> metadata_match_criteria_;
39
};
40

            
41
class MetadataMatchCriterionImpl : public MetadataMatchCriterion {
42
public:
43
  MetadataMatchCriterionImpl(const std::string& name, const HashedValue& value)
44
248
      : name_(name), value_(value) {}
45

            
46
4594
  const std::string& name() const override { return name_; }
47
1190
  const HashedValue& value() const override { return value_; }
48

            
49
private:
50
  const std::string name_;
51
  const HashedValue value_;
52
};
53

            
54
} // namespace Router
55
} // namespace Envoy