11# frozen_string_literal: true
22
3+ require "cloud_events/event/utils"
4+
35module CloudEvents
46 module Event
57 ##
68 # A helper that extracts and interprets event fields from an input hash.
7- #
89 # @private
910 #
1011 class FieldInterpreter
1112 def initialize args
12- @args = keys_to_strings args
13+ @args = Utils . keys_to_strings args
1314 @attributes = { }
1415 end
1516
@@ -26,6 +27,7 @@ def string keys, required: false
2627 case value
2728 when ::String
2829 raise AttributeError , "The #{ keys . first } field cannot be empty" if value . empty?
30+ value . freeze
2931 [ value , value ]
3032 else
3133 raise AttributeError , "Illegal type for #{ keys . first } :" \
@@ -40,12 +42,12 @@ def uri keys, required: false
4042 when ::String
4143 raise AttributeError , "The #{ keys . first } field cannot be empty" if value . empty?
4244 begin
43- [ ::URI . parse ( value ) , value ]
45+ [ Utils . deep_freeze ( ::URI . parse ( value ) ) , value . freeze ]
4446 rescue ::URI ::InvalidURIError => e
4547 raise AttributeError , "Illegal format for #{ keys . first } : #{ e . message } "
4648 end
4749 when ::URI ::Generic
48- [ value , value . to_s ]
50+ [ Utils . deep_freeze ( value ) , value . to_s . freeze ]
4951 else
5052 raise AttributeError , "Illegal type for #{ keys . first } :" \
5153 " String or URI expected but #{ value . class } found"
@@ -58,15 +60,15 @@ def rfc3339_date_time keys, required: false
5860 case value
5961 when ::String
6062 begin
61- [ ::DateTime . rfc3339 ( value ) , value ]
63+ [ Utils . deep_freeze ( ::DateTime . rfc3339 ( value ) ) , value . freeze ]
6264 rescue ::Date ::Error => e
6365 raise AttributeError , "Illegal format for #{ keys . first } : #{ e . message } "
6466 end
6567 when ::DateTime
66- [ value , value . rfc3339 ]
68+ [ Utils . deep_freeze ( value ) , value . rfc3339 . freeze ]
6769 when ::Time
6870 value = value . to_datetime
69- [ value , value . rfc3339 ]
71+ [ Utils . deep_freeze ( value ) , value . rfc3339 . freeze ]
7072 else
7173 raise AttributeError , "Illegal type for #{ keys . first } :" \
7274 " String, Time, or DateTime expected but #{ value . class } found"
@@ -79,7 +81,7 @@ def content_type keys, required: false
7981 case value
8082 when ::String
8183 raise AttributeError , "The #{ keys . first } field cannot be empty" if value . empty?
82- [ ContentType . new ( value ) , value ]
84+ [ ContentType . new ( value ) , value . freeze ]
8385 when ContentType
8486 [ value , value . to_s ]
8587 else
@@ -94,6 +96,7 @@ def spec_version keys, accept:
9496 case value
9597 when ::String
9698 raise SpecVersionError , "Unrecognized specversion: #{ value } " unless accept =~ value
99+ value . freeze
97100 [ value , value ]
98101 else
99102 raise AttributeError , "Illegal type for #{ keys . first } :" \
@@ -102,8 +105,17 @@ def spec_version keys, accept:
102105 end
103106 end
104107
108+ def data_object keys , required : false
109+ object keys , required : required , allow_nil : true do |value |
110+ Utils . deep_freeze value
111+ [ value , value ]
112+ end
113+ end
114+
105115 UNDEFINED = ::Object . new . freeze
106116
117+ private
118+
107119 def object keys , required : false , allow_nil : false
108120 value = UNDEFINED
109121 keys . each do |key |
@@ -115,44 +127,10 @@ def object keys, required: false, allow_nil: false
115127 raise AttributeError , "The #{ keys . first } field is required" if required
116128 return nil
117129 end
118- if block_given?
119- converted , raw = yield value
120- deep_freeze converted
121- else
122- converted = raw = value
123- end
124- @attributes [ keys . first . freeze ] = raw . freeze
130+ converted , raw = yield value
131+ @attributes [ keys . first . freeze ] = raw
125132 converted
126133 end
127-
128- private
129-
130- def deep_freeze obj
131- case obj
132- when ::Hash
133- obj . each do |key , val |
134- deep_freeze key
135- deep_freeze val
136- end
137- when ::Array
138- obj . each do |val |
139- deep_freeze val
140- end
141- else
142- obj . instance_variables . each do |iv |
143- deep_freeze obj . instance_variable_get iv
144- end
145- end
146- obj . freeze
147- end
148-
149- def keys_to_strings hash
150- result = { }
151- hash . each do |key , val |
152- result [ key . to_s ] = val
153- end
154- result
155- end
156134 end
157135 end
158136end
0 commit comments