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
|
# File 'lib/cel/encoder.rb', line 68
def decode(enc)
case enc
in ["group", stmt]
Group.new(decode(stmt))
in ["inv", var, ::String => func, *args]
args = if func == "[]" && args.size == 1
decode(args.first)
elsif args.empty?
nil
else
args.map(&method(:decode))
end
Invoke.new(func: func, var: decode(var), args: args)
in ["inv", ::String => func, *args]
args = nil if args.empty?
Invoke.new(func: func, args: args.map(&method(:decode)))
in ["op", ::String => op, *args]
Operation.new(op, args.map(&method(:decode)))
in ["cond", f, th, el]
Condition.new(decode(f), decode(th), decode(el))
in ["id", ::String => type, ::String => val]
id = Identifier.new(val)
id.type = TYPES[type.to_sym]
id
in ["lit", "list", *items]
List.new(items.map(&method(:decode)))
in ["lit", "map", items]
Map.new(decode(items))
in ["lit", /\Aint|uint|double\z/ => type, Integer => val]
Number.new(type.to_sym, val)
in ["lit", "bool", val]
Bool.cast(val)
in ["lit", "string", val]
String.new(val)
in ["lit", "bytes", val]
Bytes.new(val)
in ["lit", "null"]
Null::INSTANCE
in ["lit", "type", type]
TYPES[type.to_sym]
in ["message", name, struct]
Cel::Message.new(name, decode(struct))
in **items
items.to_h { |*kv| kv.map(&method(:decode)) }
in *items
items.map(&method(:decode)).each_slice(2)
else
enc
end
end
|