-
Notifications
You must be signed in to change notification settings - Fork 381
/
Copy pathresolver.rb
81 lines (75 loc) · 2.8 KB
/
resolver.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
module Datadog
module Contrib
module Configuration
# Resolves an integration-specific matcher to an associated
# object.
#
# Integrations that perform any configuration matching
# based on patterns might want to override this class
# to provide richer matching. For example, match configuration
# based on: HTTP request parameters, request headers,
# async queue name.
#
# When overriding this class, for simple use cases, only
# overriding `#parse_matcher` might suffice. See
# `#parse_matcher`'s documentation for more information.
class Resolver
attr_reader :configurations
def initialize
@configurations = {}
end
# Adds a new `matcher`, associating with it a `value`.
#
# This `value` is returned when `#resolve` is called
# with a matching value for this matcher. When multiple
# matchers would match, `#resolve` returns the latest
# added one.
#
# The `matcher` can be transformed internally by the
# `#parse_matcher` method before being stored.
#
# The `value` can also be retrieved by calling `#get`
# with the same `matcher` added by this method.
#
# @param [Object] matcher integration-specific matcher
# @param [Object] value arbitrary value to be associated with `matcher`
def add(matcher, value)
@configurations[parse_matcher(matcher)] = value
end
# Retrieves the stored value for a `matcher`
# previously stored by `#add`.
#
# @param [Object] matcher integration-specific matcher
# @return [Object] previously stored `value` from `#add`, or `nil` if not found
def get(matcher)
@configurations[parse_matcher(matcher)]
end
# Matches an arbitrary value against the configured
# matchers previously set with `#add`.
#
# If multiple matchers would match, returns the latest one.
#
# @param [Object] value integration-specific value
# @return [Object] matching `value` configured at `#add`, or `nil` if none match
def resolve(value)
@configurations[value]
end
protected
# Converts `matcher` into an appropriate key
# for the internal Hash storage.
#
# It's recommended to override this method,
# instead of the public methods, if the
# integration can simply convert both
# `matcher` (provided to `#add`) and `value`
# (provided to `#resolve`) to the same value.
#
# @param [Object] matcher integration-specific matcher
# @return [Object] processed matcher
def parse_matcher(matcher)
matcher
end
end
end
end
end