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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
# File 'lib/cel/ast/types.rb', line 40
def cast(value)
type = nil
type = value.type.to_sym if value.is_a?(Literal)
case @type
when :int
case type
when :int, :uint, :string
value = Integer(value.value)
raise "Type conversion range error" unless (-(MAX_INT - 1)...MAX_INT).cover?(value)
Number.new(:int, value)
when :double
value = value.value
raise "Type conversion range error" unless (-(MAX_FLOAT - 1)...MAX_FLOAT).cover?(value)
Number.new(:int, Integer(value))
when :timestamp
Number.new(:int, value.value.to_i)
else
raise EvaluateError, "Type conversion error"
end
when :uint
case type
when :int, :uint, :string
value = Integer(value.value)
raise EvaluateError, "Type conversion range error" unless (0...MAX_INT).cover?(value)
Number.new(:uint, value)
when :double
value = value.value
raise EvaluateError, "Type conversion range error" unless (0...MAX_FLOAT).cover?(value)
Number.new(:uint, Integer(value))
else
raise EvaluateError, "Type conversion error"
end
when :double
case type
when :double, :int, :uint
Number.new(:double, Float(value.value))
when :string
case value
when "NaN"
raise Error, "unsupported cast operation to #{@type}" unless defined?(Float::NAN)
Number.new(:double, Float::NAN)
else
Number.new(:double, Float(value.value))
end
else
raise EvaluateError, "Type conversion error"
end
when :string
case type
when :bytes
value = value.string.force_encoding(Encoding::UTF_8)
raise EvaluateError, "Type conversion invalid UTF-8" unless value.valid_encoding?
String.new(value)
when :timestamp
String.new(value.value.iso8601(9).sub(/\.0+Z/, "Z"))
when :duration
String.new(value.to_s)
else
String.new(String(value.value))
end
when :bytes
case type
when :bytes
value
when :string
Bytes.new(value.value.bytes)
else
raise EvaluateError, "Type conversion error"
end
when :bool
case type
when :bool
value
when :string
case value.value
when "1", "t", "true", "TRUE", "True"
Bool.new(true)
when "0", "f", "false", "FALSE", "False"
Bool.new(false)
else
raise EvaluateError, "Type conversion error"
end
else
raise EvaluateError, "Type conversion error"
end
when :null_type
Null::INSTANCE
when :timestamp
case type
when :timestamp
value
when :int, :string
Timestamp.new(value.value)
else
raise EvaluateError, "Type conversion error"
end
when :duration
case type
when :duration
value
when :string
Duration.new(value.value)
else
raise EvaluateError, "Type conversion error"
end
when :any
value
else
raise Error, "unsupported cast operation to #{@type}"
end
end
|