195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
-- }
local def, name
if select('#', ...) >= 2 then
name, def = ...
else
def = ...
end
name = 'struct' .. (name and ':' .. name or '');
report('defining struct name=%q fields=%s', name, dump(def))
return {
name = name;
enc = function(obj)
report('encoding struct name=%q vals=%s', name, dump(obj))
local enc = m.streamEncoder()
local n = 0
for k,ty in pairs(def) do n=n+1
if obj[k] == nil then error('missing key '..dump(k)..' for type '..ty.name) end
local encoded = ty.enc(obj[k])
enc.push(T.u8.enc(#k), size.enc(#encoded), k, encoded)
end
return size.enc(n) .. enc.peek()
end;
dec = debugger.wrap(function(blob)
if blob == '' then
|
|
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
-- }
local def, name
if select('#', ...) >= 2 then
name, def = ...
else
def = ...
end
name = 'struct' .. (name and (':' .. name) or '');
report('defining struct name=%q fields=%s', name, dump(def))
return {
name = name;
enc = function(obj)
report('encoding struct name=%q vals=%s', name, dump(obj))
local enc = m.streamEncoder()
local n = 0
for k,ty in pairs(def) do n=n+1
if obj[k] == nil then
error(string.format("missing %s field %q for %s", ty.name, k, name))
end
local encoded = ty.enc(obj[k])
enc.push(T.u8.enc(#k), size.enc(#encoded), k, encoded)
end
return size.enc(n) .. enc.peek()
end;
dec = debugger.wrap(function(blob)
if blob == '' then
|