Module: Agent::SessionContext::Renderers::Serializer

Defined in:
lib/agent/session_context/renderers/serializer.rb

Class Method Summary collapse

Class Method Details

.data_object?(value) ⇒ Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/agent/session_context/renderers/serializer.rb', line 36

def data_object?(value)
  defined?(Data) && value.is_a?(Data)
end

.detect_duplicate_keys!(entries) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/agent/session_context/renderers/serializer.rb', line 60

def detect_duplicate_keys!(entries)
  entries.group_by(&:first).sort_by(&:first).each do |key, grouped_entries|
    next unless grouped_entries.length > 1

    raise ArgumentError, "duplicate serialized key: #{safe_dump(key)}"
  end
end

.normalized_hash_entries(value) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/agent/session_context/renderers/serializer.rb', line 52

def normalized_hash_entries(value)
  entries = value.each_with_object([]) do |(key, nested_value), collected|
    collected << [normalized_key(key), nested_value]
  end
  detect_duplicate_keys!(entries)
  entries.sort_by(&:first)
end

.normalized_key(key) ⇒ Object



93
94
95
# File 'lib/agent/session_context/renderers/serializer.rb', line 93

def normalized_key(key)
  scrub_string(key.to_s)
end

.safe_dump(value) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/agent/session_context/renderers/serializer.rb', line 97

def safe_dump(value)
  case value
  when String
    scrub_string(value).dump
  when Symbol
    scrub_string(value.to_s).dump
  when Float
    return "NaN" if value.nan?
    return "Infinity" if value.infinite? == 1
    return "-Infinity" if value.infinite? == -1

    value.to_s
  else
    scrub_string(value.inspect)
  end
end

.scrub_string(value) ⇒ Object



32
33
34
# File 'lib/agent/session_context/renderers/serializer.rb', line 32

def scrub_string(value)
  value.encode("UTF-8", invalid: :replace, undef: :replace)
end

.serialize(value) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/agent/session_context/renderers/serializer.rb', line 9

def serialize(value)
  case value
  when nil, true, false, Integer
    value
  when Float
    serialize_float(value)
  when String
    scrub_string(value)
  when Symbol
    scrub_string(value.to_s)
  when Time
    value.iso8601
  when Array
    value.map { |entry| serialize(entry) }
  when Hash
    serialize_hash(value)
  else
    return serialize_data(value) if data_object?(value)

    scrub_string(value.to_s)
  end
end

.serialize_data(value) ⇒ Object



40
41
42
43
44
# File 'lib/agent/session_context/renderers/serializer.rb', line 40

def serialize_data(value)
  value.members.to_h do |member|
    [member.to_s, serialize_member(member, value.public_send(member))]
  end
end

.serialize_float(value) ⇒ Object

Raises:

  • (ArgumentError)


87
88
89
90
91
# File 'lib/agent/session_context/renderers/serializer.rb', line 87

def serialize_float(value)
  raise ArgumentError, "unsupported numeric value: #{unsupported_value_label(value)}" unless value.finite?

  value
end

.serialize_hash(value) ⇒ Object



46
47
48
49
50
# File 'lib/agent/session_context/renderers/serializer.rb', line 46

def serialize_hash(value)
  normalized_hash_entries(value).each_with_object({}) do |(key, nested_value), serialized|
    serialized[key] = serialize(nested_value)
  end
end

.serialize_member(member, value) ⇒ Object



68
69
70
71
72
# File 'lib/agent/session_context/renderers/serializer.rb', line 68

def serialize_member(member, value)
  return serialize_timestamp(value) if %i[at captured_at].include?(member.to_sym)

  serialize(value)
end

.serialize_timestamp(value) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/agent/session_context/renderers/serializer.rb', line 74

def serialize_timestamp(value)
  case value
  when nil
    nil
  when Time
    value.iso8601
  when String
    scrub_string(value)
  else
    raise ArgumentError, "unsupported timestamp value: #{unsupported_value_label(value)}"
  end
end

.unsupported_value_label(value) ⇒ Object



114
115
116
117
118
119
120
# File 'lib/agent/session_context/renderers/serializer.rb', line 114

def unsupported_value_label(value)
  klass = value.class
  name = klass.name
  return "(anonymous class)" if name.nil? || name.empty?

  scrub_string(name)
end