-- Code generated by protoc-gen-tarantool. DO NOT EDIT. -- source: hello.proto -- syntax: proto3 -- package: hello local pb = require("pb") local wire = pb.wire local string_byte = string.byte local utf8_len = require('utf8').len local band = bit.band local rshift = bit.rshift local table_new = require('table.new') local M = {} M.options = {go_package = "tarantoolpb_synthetic/hello"} -- Enum: hello.Status M.Status_descriptor = pb.enum("hello.Status", { UNKNOWN = 0, OK = 1, ERROR = 2, }) M.Status = M.Status_descriptor.by_name -- Pre-declare message descriptors so cross-references resolve. M.Result_descriptor = {name = "hello.Result"} M.HelloRequest_descriptor = {name = "hello.HelloRequest"} M.HelloReply_descriptor = {name = "hello.HelloReply"} M.Event_descriptor = {name = "hello.Event"} M.Address_descriptor = {name = "hello.Address"} M.Person_descriptor = {name = "hello.Person"} -- Message: hello.Result M.Result_descriptor.fields = { {name="id", id=1, kind='scalar', proto_type="int32"}, {name="text", id=2, kind='scalar', proto_type="string", oneof="outcome"}, {name="code", id=3, kind='scalar', proto_type="int32", oneof="outcome"}, {name="details", id=4, kind='message', message=M.Address_descriptor, oneof="outcome"}, } M.Result_descriptor.oneofs = { outcome = {"text", "code", "details"}, } pb.finalize_message(M.Result_descriptor) M.Result_fields = pb.field_names({ id = "id", text = "text", code = "code", details = "details", }) M.Result_oneofs = pb.field_names({ outcome = "outcome", }) -- Message: hello.HelloRequest M.HelloRequest_descriptor.fields = { {name="name", id=1, kind='scalar', proto_type="string"}, } pb.finalize_message(M.HelloRequest_descriptor) M.HelloRequest_fields = pb.field_names({ name = "name", }) -- Message: hello.HelloReply M.HelloReply_descriptor.fields = { {name="greeting", id=1, kind='scalar', proto_type="string"}, } pb.finalize_message(M.HelloReply_descriptor) M.HelloReply_fields = pb.field_names({ greeting = "greeting", }) -- Message: hello.Event M.Event_descriptor.fields = { {name="title", id=1, kind='scalar', proto_type="string"}, {name="created_at", id=2, kind='message', message=pb.wkt.Timestamp_descriptor}, {name="duration", id=3, kind='message', message=pb.wkt.Duration_descriptor}, {name="ack", id=4, kind='message', message=pb.wkt.Empty_descriptor}, {name="retry_count", id=5, kind='message', message=pb.wkt.Int32Value_descriptor}, {name="note", id=6, kind='message', message=pb.wkt.StringValue_descriptor}, {name="is_admin", id=7, kind='message', message=pb.wkt.BoolValue_descriptor}, {name="payload", id=8, kind='message', message=pb.wkt.Struct_descriptor}, {name="attribute", id=9, kind='message', message=pb.wkt.Value_descriptor}, {name="tags", id=10, kind='message', message=pb.wkt.ListValue_descriptor}, {name="extension", id=11, kind='message', message=pb.wkt.Any_descriptor}, {name="update_mask", id=12, kind='message', message=pb.wkt.FieldMask_descriptor}, } pb.finalize_message(M.Event_descriptor) M.Event_fields = pb.field_names({ title = "title", created_at = "created_at", duration = "duration", ack = "ack", retry_count = "retry_count", note = "note", is_admin = "is_admin", payload = "payload", attribute = "attribute", tags = "tags", extension = "extension", update_mask = "update_mask", }) -- Message: hello.Address M.Address_descriptor.fields = { {name="street", id=1, kind='scalar', proto_type="string"}, {name="city", id=2, kind='scalar', proto_type="string"}, {name="zip", id=3, kind='scalar', proto_type="int32"}, {name="apartment", id=4, kind='scalar', proto_type="string", optional=true}, } pb.finalize_message(M.Address_descriptor) M.Address_fields = pb.field_names({ street = "street", city = "city", zip = "zip", apartment = "apartment", }) -- Message: hello.Person M.Person_descriptor.fields = { {name="name", id=1, kind='scalar', proto_type="string"}, {name="age", id=2, kind='scalar', proto_type="int32"}, {name="emails", id=3, kind='scalar', proto_type="string", repeated=true}, {name="status", id=4, kind='enum', enum=M.Status_descriptor}, {name="address", id=5, kind='message', message=M.Address_descriptor}, {name="friends", id=6, kind='message', message=M.Person_descriptor, repeated=true}, {name="lucky_numbers", id=7, kind='scalar', proto_type="int32", repeated=true, packed=true}, {name="avatar", id=8, kind='scalar', proto_type="bytes"}, {name="user_id", id=9, kind='scalar', proto_type="fixed64"}, {name="balance", id=10, kind='scalar', proto_type="sint32"}, {name="weight_kg", id=11, kind='scalar', proto_type="double"}, {name="ages_by_nickname", id=13, kind='map', key={kind='scalar', proto_type="string"}, value={kind='scalar', proto_type="int32"}}, {name="nickname_by_age", id=14, kind='map', key={kind='scalar', proto_type="int32"}, value={kind='scalar', proto_type="string"}}, {name="addresses_by_label", id=15, kind='map', key={kind='scalar', proto_type="string"}, value={kind='message', message=M.Address_descriptor}}, } pb.finalize_message(M.Person_descriptor) M.Person_fields = pb.field_names({ name = "name", age = "age", emails = "emails", status = "status", address = "address", friends = "friends", lucky_numbers = "lucky_numbers", avatar = "avatar", user_id = "user_id", balance = "balance", weight_kg = "weight_kg", ages_by_nickname = "ages_by_nickname", nickname_by_age = "nickname_by_age", addresses_by_label = "addresses_by_label", }) -- EmmyLua / lua-language-server type annotations. -- These are comments — no runtime effect. They give editors -- autocomplete and type-checking for the generated wrappers. ---@alias hello.Status integer --- Demo message for oneof handling. ---@class hello.Result ---@field id integer ---@field text? string ---@field code? integer ---@field details? hello.Address --- gRPC service demo. Covers unary + all three streaming flavors so the --- loopback transport exercises every codegen branch. ---@class hello.HelloRequest ---@field name string ---@class hello.HelloReply ---@field greeting string --- Demo message exercising well-known types (M3). ---@class hello.Event ---@field title string ---@field created_at google.protobuf.Timestamp ---@field duration google.protobuf.Duration ---@field ack google.protobuf.Empty ---@field retry_count google.protobuf.Int32Value ---@field note google.protobuf.StringValue ---@field is_admin google.protobuf.BoolValue ---@field payload google.protobuf.Struct ---@field attribute google.protobuf.Value ---@field tags google.protobuf.ListValue ---@field extension google.protobuf.Any ---@field update_mask google.protobuf.FieldMask ---@class hello.Address ---@field street string ---@field city string ---@field zip integer ---@field apartment? string @ Explicit-optional: presence is meaningful (distinct from default). ---@class hello.Person ---@field name string ---@field age integer ---@field emails string[] ---@field status hello.Status ---@field address hello.Address ---@field friends hello.Person[] ---@field lucky_numbers integer[] ---@field avatar string ---@field user_id integer ---@field balance integer ---@field weight_kg number ---@field ages_by_nickname table @ Map fields (M2) ---@field nickname_by_age table ---@field addresses_by_label table ---@param t? hello.Result ---@return hello.Result function M.Result_new(t) return t or {} end ---@param t hello.Result ---@return string function M.Result_encode(t) local encode_int32 = wire.encode_int32 local encode_varint = wire.encode_varint local _d = M.Result_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.encode(_p, t) end if type(t) ~= 'table' then error("expected table for hello.Result, got " .. type(t), 0) end local out, n = {}, 0 local v local _of_outcome if t.text ~= nil then _of_outcome = "text" end if t.code ~= nil then _of_outcome = "code" end if t.details ~= nil then _of_outcome = "details" end -- field 1: id v = t.id if v ~= nil and v ~= 0 then n = n + 1; out[n] = "\x08" n = n + 1; out[n] = encode_int32(v) end -- field 2: text v = t.text if _of_outcome == "text" then n = n + 1; out[n] = "\x12" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end -- field 3: code v = t.code if _of_outcome == "code" then n = n + 1; out[n] = "\x18" n = n + 1; out[n] = encode_int32(v) end -- field 4: details v = t.details if _of_outcome == "details" then local _b = M.Address_encode(v) n = n + 1; out[n] = "\x22" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end local _uf = t._unknown_fields if _uf ~= nil and _uf ~= '' then n = n + 1; out[n] = _uf end return table.concat(out) end ---@param b string ---@return hello.Result function M.Result_decode(buf) local decode_int32 = wire.decode_int32 local _d = M.Result_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.decode(_p, buf) end if type(buf) ~= 'string' then error("expected string for hello.Result decode, got " .. type(buf), 0) end local result = {} local pos, len = 1, #buf local _uf while pos <= len do local _tag_start = pos local id, wt local _b = string_byte(buf, pos) if _b ~= nil and _b < 0x80 then wt = band(_b, 7) if wt >= 6 then error("illegal wire type " .. wt, 0) end id = rshift(_b, 3) if id == 0 then error("illegal field number 0", 0) end pos = pos + 1 else id, wt, pos = wire.decode_tag(buf, pos) end if id == 1 then local val val, pos = decode_int32(buf, pos) result.id = val elseif id == 2 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.text = _s pos = _epos else local val val, pos = wire.decode_string(buf, pos) result.text = val end result.code = nil result.details = nil elseif id == 3 then local val val, pos = decode_int32(buf, pos) result.code = val result.text = nil result.details = nil elseif id == 4 then local payload payload, pos = wire.decode_len(buf, pos) local prev = result.details if prev == nil then result.details = M.Address_decode(payload) else pb.codec.merge_message(M.Address_descriptor, prev, M.Address_decode(payload)) end result.text = nil result.code = nil else local _ebid = M.Result_descriptor.extensions_by_id local _ext = _ebid and _ebid[id] or nil if _ext ~= nil then pos = pb.codec.decode_extension(_ext, buf, pos, wt, result) else pos = wire.skip_field(buf, pos, wt, id) if _uf == nil then _uf = {} end _uf[#_uf + 1] = buf:sub(_tag_start, pos - 1) end end end if _uf ~= nil then result._unknown_fields = table.concat(_uf) end return result end ---@param b string ---@return pb.MessageView function M.Result_decode_lazy(b) return pb.decode_lazy(M.Result_descriptor, b) end ---@param t hello.Result ---@param opts? {single_line: boolean?, indent: string?} ---@return string function M.Result_text(t, opts) return pb.text.encode(M.Result_descriptor, t, opts) end ---@param t? hello.HelloRequest ---@return hello.HelloRequest function M.HelloRequest_new(t) return t or {} end ---@param t hello.HelloRequest ---@return string function M.HelloRequest_encode(t) local _d = M.HelloRequest_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.encode(_p, t) end if type(t) ~= 'table' then error("expected table for hello.HelloRequest, got " .. type(t), 0) end local out, n = {}, 0 local v -- field 1: name v = t.name if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x0a" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = wire.encode_varint(_len) end n = n + 1; out[n] = v end local _uf = t._unknown_fields if _uf ~= nil and _uf ~= '' then n = n + 1; out[n] = _uf end return table.concat(out) end ---@param b string ---@return hello.HelloRequest function M.HelloRequest_decode(buf) local _d = M.HelloRequest_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.decode(_p, buf) end if type(buf) ~= 'string' then error("expected string for hello.HelloRequest decode, got " .. type(buf), 0) end local result = {} local pos, len = 1, #buf local _uf while pos <= len do local _tag_start = pos local id, wt local _b = string_byte(buf, pos) if _b ~= nil and _b < 0x80 then wt = band(_b, 7) if wt >= 6 then error("illegal wire type " .. wt, 0) end id = rshift(_b, 3) if id == 0 then error("illegal field number 0", 0) end pos = pos + 1 else id, wt, pos = wire.decode_tag(buf, pos) end if id == 1 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.name = _s pos = _epos else local val val, pos = wire.decode_string(buf, pos) result.name = val end else local _ebid = M.HelloRequest_descriptor.extensions_by_id local _ext = _ebid and _ebid[id] or nil if _ext ~= nil then pos = pb.codec.decode_extension(_ext, buf, pos, wt, result) else pos = wire.skip_field(buf, pos, wt, id) if _uf == nil then _uf = {} end _uf[#_uf + 1] = buf:sub(_tag_start, pos - 1) end end end if _uf ~= nil then result._unknown_fields = table.concat(_uf) end return result end ---@param b string ---@return pb.MessageView function M.HelloRequest_decode_lazy(b) return pb.decode_lazy(M.HelloRequest_descriptor, b) end ---@param t hello.HelloRequest ---@param opts? {single_line: boolean?, indent: string?} ---@return string function M.HelloRequest_text(t, opts) return pb.text.encode(M.HelloRequest_descriptor, t, opts) end ---@param t? hello.HelloReply ---@return hello.HelloReply function M.HelloReply_new(t) return t or {} end ---@param t hello.HelloReply ---@return string function M.HelloReply_encode(t) local _d = M.HelloReply_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.encode(_p, t) end if type(t) ~= 'table' then error("expected table for hello.HelloReply, got " .. type(t), 0) end local out, n = {}, 0 local v -- field 1: greeting v = t.greeting if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x0a" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = wire.encode_varint(_len) end n = n + 1; out[n] = v end local _uf = t._unknown_fields if _uf ~= nil and _uf ~= '' then n = n + 1; out[n] = _uf end return table.concat(out) end ---@param b string ---@return hello.HelloReply function M.HelloReply_decode(buf) local _d = M.HelloReply_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.decode(_p, buf) end if type(buf) ~= 'string' then error("expected string for hello.HelloReply decode, got " .. type(buf), 0) end local result = {} local pos, len = 1, #buf local _uf while pos <= len do local _tag_start = pos local id, wt local _b = string_byte(buf, pos) if _b ~= nil and _b < 0x80 then wt = band(_b, 7) if wt >= 6 then error("illegal wire type " .. wt, 0) end id = rshift(_b, 3) if id == 0 then error("illegal field number 0", 0) end pos = pos + 1 else id, wt, pos = wire.decode_tag(buf, pos) end if id == 1 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.greeting = _s pos = _epos else local val val, pos = wire.decode_string(buf, pos) result.greeting = val end else local _ebid = M.HelloReply_descriptor.extensions_by_id local _ext = _ebid and _ebid[id] or nil if _ext ~= nil then pos = pb.codec.decode_extension(_ext, buf, pos, wt, result) else pos = wire.skip_field(buf, pos, wt, id) if _uf == nil then _uf = {} end _uf[#_uf + 1] = buf:sub(_tag_start, pos - 1) end end end if _uf ~= nil then result._unknown_fields = table.concat(_uf) end return result end ---@param b string ---@return pb.MessageView function M.HelloReply_decode_lazy(b) return pb.decode_lazy(M.HelloReply_descriptor, b) end ---@param t hello.HelloReply ---@param opts? {single_line: boolean?, indent: string?} ---@return string function M.HelloReply_text(t, opts) return pb.text.encode(M.HelloReply_descriptor, t, opts) end ---@param t? hello.Event ---@return hello.Event function M.Event_new(t) return t or {} end ---@param t hello.Event ---@return string function M.Event_encode(t) local encode_varint = wire.encode_varint local _d = M.Event_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.encode(_p, t) end if type(t) ~= 'table' then error("expected table for hello.Event, got " .. type(t), 0) end local out, n = {}, 0 local v -- field 1: title v = t.title if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x0a" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end -- field 2: created_at v = t.created_at if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Timestamp_encode(v) n = n + 1; out[n] = "\x12" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 3: duration v = t.duration if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Duration_encode(v) n = n + 1; out[n] = "\x1a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 4: ack v = t.ack if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Empty_encode(v) n = n + 1; out[n] = "\x22" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 5: retry_count v = t.retry_count if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Int32Value_encode(v) n = n + 1; out[n] = "\x2a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 6: note v = t.note if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.StringValue_encode(v) n = n + 1; out[n] = "\x32" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 7: is_admin v = t.is_admin if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.BoolValue_encode(v) n = n + 1; out[n] = "\x3a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 8: payload v = t.payload if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Struct_encode(v) n = n + 1; out[n] = "\x42" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 9: attribute v = t.attribute if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Value_encode(v) n = n + 1; out[n] = "\x4a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 10: tags v = t.tags if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.ListValue_encode(v) n = n + 1; out[n] = "\x52" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 11: extension v = t.extension if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.Any_encode(v) n = n + 1; out[n] = "\x5a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 12: update_mask v = t.update_mask if v ~= nil or type(v) == 'cdata' then local _b = pb.wkt.FieldMask_encode(v) n = n + 1; out[n] = "\x62" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end local _uf = t._unknown_fields if _uf ~= nil and _uf ~= '' then n = n + 1; out[n] = _uf end return table.concat(out) end ---@param b string ---@return hello.Event function M.Event_decode(buf) local decode_len = wire.decode_len local _d = M.Event_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.decode(_p, buf) end if type(buf) ~= 'string' then error("expected string for hello.Event decode, got " .. type(buf), 0) end local result = {} local pos, len = 1, #buf local _uf while pos <= len do local _tag_start = pos local id, wt local _b = string_byte(buf, pos) if _b ~= nil and _b < 0x80 then wt = band(_b, 7) if wt >= 6 then error("illegal wire type " .. wt, 0) end id = rshift(_b, 3) if id == 0 then error("illegal field number 0", 0) end pos = pos + 1 else id, wt, pos = wire.decode_tag(buf, pos) end if id == 1 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.title = _s pos = _epos else local val val, pos = wire.decode_string(buf, pos) result.title = val end elseif id == 2 then local payload payload, pos = decode_len(buf, pos) result.created_at = pb.wkt.Timestamp_decode(payload) elseif id == 3 then local payload payload, pos = decode_len(buf, pos) result.duration = pb.wkt.Duration_decode(payload) elseif id == 4 then local payload payload, pos = decode_len(buf, pos) result.ack = pb.wkt.Empty_decode(payload) elseif id == 5 then local payload payload, pos = decode_len(buf, pos) result.retry_count = pb.wkt.Int32Value_decode(payload) elseif id == 6 then local payload payload, pos = decode_len(buf, pos) result.note = pb.wkt.StringValue_decode(payload) elseif id == 7 then local payload payload, pos = decode_len(buf, pos) result.is_admin = pb.wkt.BoolValue_decode(payload) elseif id == 8 then local payload payload, pos = decode_len(buf, pos) result.payload = pb.wkt.Struct_decode(payload) elseif id == 9 then local payload payload, pos = decode_len(buf, pos) result.attribute = pb.wkt.Value_decode(payload) elseif id == 10 then local payload payload, pos = decode_len(buf, pos) result.tags = pb.wkt.ListValue_decode(payload) elseif id == 11 then local payload payload, pos = decode_len(buf, pos) result.extension = pb.wkt.Any_decode(payload) elseif id == 12 then local payload payload, pos = decode_len(buf, pos) result.update_mask = pb.wkt.FieldMask_decode(payload) else local _ebid = M.Event_descriptor.extensions_by_id local _ext = _ebid and _ebid[id] or nil if _ext ~= nil then pos = pb.codec.decode_extension(_ext, buf, pos, wt, result) else pos = wire.skip_field(buf, pos, wt, id) if _uf == nil then _uf = {} end _uf[#_uf + 1] = buf:sub(_tag_start, pos - 1) end end end if _uf ~= nil then result._unknown_fields = table.concat(_uf) end return result end ---@param b string ---@return pb.MessageView function M.Event_decode_lazy(b) return pb.decode_lazy(M.Event_descriptor, b) end ---@param t hello.Event ---@param opts? {single_line: boolean?, indent: string?} ---@return string function M.Event_text(t, opts) return pb.text.encode(M.Event_descriptor, t, opts) end ---@param t? hello.Address ---@return hello.Address function M.Address_new(t) return t or {} end ---@param t hello.Address ---@return string function M.Address_encode(t) local encode_varint = wire.encode_varint local _d = M.Address_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.encode(_p, t) end if type(t) ~= 'table' then error("expected table for hello.Address, got " .. type(t), 0) end local out, n = {}, 0 local v -- field 1: street v = t.street if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x0a" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end -- field 2: city v = t.city if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x12" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end -- field 3: zip v = t.zip if v ~= nil and v ~= 0 then n = n + 1; out[n] = "\x18" n = n + 1; out[n] = wire.encode_int32(v) end -- field 4: apartment v = t.apartment if v ~= nil then n = n + 1; out[n] = "\x22" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end local _uf = t._unknown_fields if _uf ~= nil and _uf ~= '' then n = n + 1; out[n] = _uf end return table.concat(out) end ---@param b string ---@return hello.Address function M.Address_decode(buf) local decode_string = wire.decode_string local _d = M.Address_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.decode(_p, buf) end if type(buf) ~= 'string' then error("expected string for hello.Address decode, got " .. type(buf), 0) end local result = {} local pos, len = 1, #buf local _uf while pos <= len do local _tag_start = pos local id, wt local _b = string_byte(buf, pos) if _b ~= nil and _b < 0x80 then wt = band(_b, 7) if wt >= 6 then error("illegal wire type " .. wt, 0) end id = rshift(_b, 3) if id == 0 then error("illegal field number 0", 0) end pos = pos + 1 else id, wt, pos = wire.decode_tag(buf, pos) end if id == 1 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.street = _s pos = _epos else local val val, pos = decode_string(buf, pos) result.street = val end elseif id == 2 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.city = _s pos = _epos else local val val, pos = decode_string(buf, pos) result.city = val end elseif id == 3 then local val val, pos = wire.decode_int32(buf, pos) result.zip = val elseif id == 4 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.apartment = _s pos = _epos else local val val, pos = decode_string(buf, pos) result.apartment = val end else local _ebid = M.Address_descriptor.extensions_by_id local _ext = _ebid and _ebid[id] or nil if _ext ~= nil then pos = pb.codec.decode_extension(_ext, buf, pos, wt, result) else pos = wire.skip_field(buf, pos, wt, id) if _uf == nil then _uf = {} end _uf[#_uf + 1] = buf:sub(_tag_start, pos - 1) end end end if _uf ~= nil then result._unknown_fields = table.concat(_uf) end return result end ---@param b string ---@return pb.MessageView function M.Address_decode_lazy(b) return pb.decode_lazy(M.Address_descriptor, b) end ---@param t hello.Address ---@param opts? {single_line: boolean?, indent: string?} ---@return string function M.Address_text(t, opts) return pb.text.encode(M.Address_descriptor, t, opts) end ---@param t hello.Address ---@return boolean function M.Address_has_apartment(t) return t.apartment ~= nil end ---@param t hello.Address function M.Address_clear_apartment(t) t.apartment = nil end ---@param t? hello.Person ---@return hello.Person function M.Person_new(t) return t or {} end ---@param t hello.Person ---@return string function M.Person_encode(t) local encode_int32 = wire.encode_int32 local encode_string = wire.encode_string local encode_varint = wire.encode_varint local _d = M.Person_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.encode(_p, t) end if type(t) ~= 'table' then error("expected table for hello.Person, got " .. type(t), 0) end local out, n = {}, 0 local v -- field 1: name v = t.name if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x0a" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end -- field 2: age v = t.age if v ~= nil and v ~= 0 then n = n + 1; out[n] = "\x10" n = n + 1; out[n] = encode_int32(v) end -- field 3: emails v = t.emails if v ~= nil and #v > 0 then local _tag = "\x1a" for _i = 1, #v do local _b = v[_i] n = n + 1; out[n] = _tag local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end end -- field 4: status v = t.status if v ~= nil then local nv = v if type(v) == 'string' then nv = M.Status[v] if nv == nil then error("unknown enum value '" .. v .. "' for hello.Status", 0) end end if nv ~= 0 then n = n + 1; out[n] = "\x20" n = n + 1; out[n] = encode_int32(nv) end end -- field 5: address v = t.address if v ~= nil or type(v) == 'cdata' then local _b = M.Address_encode(v) n = n + 1; out[n] = "\x2a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 6: friends v = t.friends if v ~= nil and #v > 0 then local _tag = "\x32" for _i = 1, #v do local _b = M.Person_encode(v[_i]) n = n + 1; out[n] = _tag local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end end -- field 7: lucky_numbers v = t.lucky_numbers if v ~= nil and #v > 0 then local parts, m = {}, 0 for _i = 1, #v do m = m + 1; parts[m] = encode_int32(v[_i]) end local _b = table.concat(parts) n = n + 1; out[n] = "\x3a" local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end -- field 8: avatar v = t.avatar if v ~= nil and v ~= '' then n = n + 1; out[n] = "\x42" local _len = #v if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = v end -- field 9: user_id v = t.user_id if v ~= nil and v ~= 0 then n = n + 1; out[n] = "\x49" n = n + 1; out[n] = wire.encode_fixed64(v) end -- field 10: balance v = t.balance if v ~= nil and v ~= 0 then n = n + 1; out[n] = "\x50" n = n + 1; out[n] = wire.encode_sint32(v) end -- field 11: weight_kg v = t.weight_kg if v ~= nil and (v ~= 0 or 1/v == -math.huge) then n = n + 1; out[n] = "\x59" n = n + 1; out[n] = wire.encode_double(v) end -- field 13: ages_by_nickname v = t.ages_by_nickname if v ~= nil and next(v) ~= nil then local _tag, _ktag, _vtag = "\x6a", "\x0a", "\x10" for _k, _val in pairs(v) do local entry, _m = {}, 0 if _k ~= '' then _m = _m + 1; entry[_m] = _ktag _m = _m + 1; entry[_m] = encode_string(_k) end if _val ~= 0 then _m = _m + 1; entry[_m] = _vtag _m = _m + 1; entry[_m] = encode_int32(_val) end n = n + 1; out[n] = _tag local _b = table.concat(entry) local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end end -- field 14: nickname_by_age v = t.nickname_by_age if v ~= nil and next(v) ~= nil then local _tag, _ktag, _vtag = "\x72", "\x08", "\x12" for _k, _val in pairs(v) do local entry, _m = {}, 0 if _k ~= 0 then _m = _m + 1; entry[_m] = _ktag _m = _m + 1; entry[_m] = encode_int32(_k) end if _val ~= '' then _m = _m + 1; entry[_m] = _vtag _m = _m + 1; entry[_m] = encode_string(_val) end n = n + 1; out[n] = _tag local _b = table.concat(entry) local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end end -- field 15: addresses_by_label v = t.addresses_by_label if v ~= nil and next(v) ~= nil then local _tag, _ktag, _vtag = "\x7a", "\x0a", "\x12" for _k, _val in pairs(v) do local entry, _m = {}, 0 if _k ~= '' then _m = _m + 1; entry[_m] = _ktag _m = _m + 1; entry[_m] = encode_string(_k) end if _val ~= nil then _m = _m + 1; entry[_m] = _vtag _m = _m + 1; entry[_m] = wire.encode_len(M.Address_encode(_val)) end n = n + 1; out[n] = _tag local _b = table.concat(entry) local _len = #_b if _len < 128 then n = n + 1; out[n] = string.char(_len) else n = n + 1; out[n] = encode_varint(_len) end n = n + 1; out[n] = _b end end local _uf = t._unknown_fields if _uf ~= nil and _uf ~= '' then n = n + 1; out[n] = _uf end return table.concat(out) end ---@param b string ---@return hello.Person function M.Person_decode(buf) local decode_int32 = wire.decode_int32 local decode_len = wire.decode_len local decode_string = wire.decode_string local decode_tag = wire.decode_tag local skip_field = wire.skip_field local _d = M.Person_descriptor if pb.c_runtime ~= nil then local _p = _d.c_plan or pb.c_runtime.compile_plan(_d) return pb.c_runtime.decode(_p, buf) end if type(buf) ~= 'string' then error("expected string for hello.Person decode, got " .. type(buf), 0) end local result = {} local pos, len = 1, #buf local _uf local _n_emails = 0 local _n_friends = 0 local _n_lucky_numbers = 0 while pos <= len do local _tag_start = pos local id, wt local _b = string_byte(buf, pos) if _b ~= nil and _b < 0x80 then wt = band(_b, 7) if wt >= 6 then error("illegal wire type " .. wt, 0) end id = rshift(_b, 3) if id == 0 then error("illegal field number 0", 0) end pos = pos + 1 else id, wt, pos = decode_tag(buf, pos) end if id == 1 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end result.name = _s pos = _epos else local val val, pos = decode_string(buf, pos) result.name = val end elseif id == 2 then local val val, pos = decode_int32(buf, pos) result.age = val elseif id == 3 then local list = result.emails if list == nil then list = {}; result.emails = list end local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) if utf8_len(_s) == nil then error("invalid UTF-8 in string field at offset " .. pos, 0) end _n_emails = _n_emails + 1; list[_n_emails] = _s pos = _epos else local val val, pos = decode_string(buf, pos) _n_emails = _n_emails + 1; list[_n_emails] = val end elseif id == 4 then local u u, pos = wire.decode_varint(buf, pos) result.status = wire.varint_to_int32(u) elseif id == 5 then local payload payload, pos = decode_len(buf, pos) local prev = result.address if prev == nil then result.address = M.Address_decode(payload) else pb.codec.merge_message(M.Address_descriptor, prev, M.Address_decode(payload)) end elseif id == 6 then local list = result.friends if list == nil then list = {}; result.friends = list end local payload payload, pos = decode_len(buf, pos) _n_friends = _n_friends + 1; list[_n_friends] = M.Person_decode(payload) elseif id == 7 then if wt == 2 then local payload payload, pos = decode_len(buf, pos) local p2, lim = 1, #payload local list = result.lucky_numbers if list == nil then list = table_new(lim, 0); result.lucky_numbers = list end while p2 <= lim do local val val, p2 = decode_int32(payload, p2) _n_lucky_numbers = _n_lucky_numbers + 1; list[_n_lucky_numbers] = val end else local list = result.lucky_numbers if list == nil then list = {}; result.lucky_numbers = list end local val val, pos = decode_int32(buf, pos) _n_lucky_numbers = _n_lucky_numbers + 1; list[_n_lucky_numbers] = val end elseif id == 8 then local _lb = string_byte(buf, pos) if _lb ~= nil and _lb < 0x80 then local _np = pos + 1 local _epos = _np + _lb if _epos - 1 > len then error("truncated LEN at offset " .. pos, 0) end local _s = buf:sub(_np, _epos - 1) result.avatar = _s pos = _epos else local val val, pos = wire.decode_bytes(buf, pos) result.avatar = val end elseif id == 9 then local val val, pos = wire.decode_fixed64(buf, pos) result.user_id = val elseif id == 10 then local val val, pos = wire.decode_sint32(buf, pos) result.balance = val elseif id == 11 then local val val, pos = wire.decode_double(buf, pos) result.weight_kg = val elseif id == 13 then local map = result.ages_by_nickname if map == nil then map = {}; result.ages_by_nickname = map end local payload payload, pos = decode_len(buf, pos) local _ep, _elim = 1, #payload local _key, _val = '', 0 while _ep <= _elim do local eid, ewt eid, ewt, _ep = decode_tag(payload, _ep) if eid == 1 then _key, _ep = decode_string(payload, _ep) elseif eid == 2 then _val, _ep = decode_int32(payload, _ep) else _ep = skip_field(payload, _ep, ewt, eid) end end map[_key] = _val elseif id == 14 then local map = result.nickname_by_age if map == nil then map = {}; result.nickname_by_age = map end local payload payload, pos = decode_len(buf, pos) local _ep, _elim = 1, #payload local _key, _val = 0, '' while _ep <= _elim do local eid, ewt eid, ewt, _ep = decode_tag(payload, _ep) if eid == 1 then _key, _ep = decode_int32(payload, _ep) elseif eid == 2 then _val, _ep = decode_string(payload, _ep) else _ep = skip_field(payload, _ep, ewt, eid) end end map[_key] = _val elseif id == 15 then local map = result.addresses_by_label if map == nil then map = {}; result.addresses_by_label = map end local payload payload, pos = decode_len(buf, pos) local _ep, _elim = 1, #payload local _key, _val = '', {} while _ep <= _elim do local eid, ewt eid, ewt, _ep = decode_tag(payload, _ep) if eid == 1 then _key, _ep = decode_string(payload, _ep) elseif eid == 2 then local _payload _payload, _ep = decode_len(payload, _ep) _val = M.Address_decode(_payload) else _ep = skip_field(payload, _ep, ewt, eid) end end map[_key] = _val else local _ebid = M.Person_descriptor.extensions_by_id local _ext = _ebid and _ebid[id] or nil if _ext ~= nil then pos = pb.codec.decode_extension(_ext, buf, pos, wt, result) else pos = skip_field(buf, pos, wt, id) if _uf == nil then _uf = {} end _uf[#_uf + 1] = buf:sub(_tag_start, pos - 1) end end end if _uf ~= nil then result._unknown_fields = table.concat(_uf) end return result end ---@param b string ---@return pb.MessageView function M.Person_decode_lazy(b) return pb.decode_lazy(M.Person_descriptor, b) end ---@param t hello.Person ---@param opts? {single_line: boolean?, indent: string?} ---@return string function M.Person_text(t, opts) return pb.text.encode(M.Person_descriptor, t, opts) end -- Service: hello.Greeter M.Greeter_service = { name = "hello.Greeter", full_name = "/hello.Greeter", methods = { SayHello = { name = "SayHello", full_name = "/hello.Greeter/SayHello", input = M.HelloRequest_descriptor, output = M.HelloReply_descriptor, }, Echo = { name = "Echo", full_name = "/hello.Greeter/Echo", input = M.HelloRequest_descriptor, output = M.HelloRequest_descriptor, }, -- Server-streaming: one request, server pushes N replies. StreamHellos = { name = "StreamHellos", full_name = "/hello.Greeter/StreamHellos", input = M.HelloRequest_descriptor, output = M.HelloReply_descriptor, server_streaming = true, }, -- Client-streaming: client pushes N requests, server returns one reply. CollectHellos = { name = "CollectHellos", full_name = "/hello.Greeter/CollectHellos", input = M.HelloRequest_descriptor, output = M.HelloReply_descriptor, client_streaming = true, }, -- Bidirectional: both sides push and pull independently. Chat = { name = "Chat", full_name = "/hello.Greeter/Chat", input = M.HelloRequest_descriptor, output = M.HelloReply_descriptor, client_streaming = true, server_streaming = true, }, }, } function M.Greeter_client(transport) if transport == nil then error("Greeter_client: transport is required", 0) end return { SayHello = function(req, ctx) local req_bytes = M.HelloRequest_encode(req) local resp_bytes = transport:unary("/hello.Greeter/SayHello", req_bytes, ctx) return M.HelloReply_decode(resp_bytes) end, Echo = function(req, ctx) local req_bytes = M.HelloRequest_encode(req) local resp_bytes = transport:unary("/hello.Greeter/Echo", req_bytes, ctx) return M.HelloRequest_decode(resp_bytes) end, -- Server-streaming: one request, server pushes N replies. StreamHellos = function(req, ctx) local req_bytes = M.HelloRequest_encode(req) local raw = transport:server_stream("/hello.Greeter/StreamHellos", req_bytes, ctx) return pb.grpc.wrap_server_stream(raw, M.HelloReply_decode) end, -- Client-streaming: client pushes N requests, server returns one reply. CollectHellos = function(ctx) local raw = transport:client_stream("/hello.Greeter/CollectHellos", ctx) return pb.grpc.wrap_call(raw, M.HelloRequest_encode, M.HelloReply_decode) end, -- Bidirectional: both sides push and pull independently. Chat = function(ctx) local raw = transport:bidi("/hello.Greeter/Chat", ctx) return pb.grpc.wrap_call(raw, M.HelloRequest_encode, M.HelloReply_decode) end, } end function M.Greeter_server(impl) if type(impl) ~= 'table' then error("Greeter_server: impl table is required", 0) end return { service = M.Greeter_service, methods = { ["/hello.Greeter/SayHello"] = function(req_bytes, ctx) local handler = impl.SayHello if handler == nil then error("Greeter.SayHello: handler missing", 0) end local req = M.HelloRequest_decode(req_bytes) local resp = handler(req, ctx) return M.HelloReply_encode(resp) end, ["/hello.Greeter/Echo"] = function(req_bytes, ctx) local handler = impl.Echo if handler == nil then error("Greeter.Echo: handler missing", 0) end local req = M.HelloRequest_decode(req_bytes) local resp = handler(req, ctx) return M.HelloRequest_encode(resp) end, }, streams = { -- Server-streaming: one request, server pushes N replies. ["/hello.Greeter/StreamHellos"] = { kind = 'server_stream', handler = function(req_bytes, server_view, ctx) local handler = impl.StreamHellos if handler == nil then error("Greeter.StreamHellos: handler missing", 0) end local req = M.HelloRequest_decode(req_bytes) local wrapped = pb.grpc.wrap_server_view(server_view, nil, M.HelloReply_encode) handler(req, wrapped, ctx) end, }, -- Client-streaming: client pushes N requests, server returns one reply. ["/hello.Greeter/CollectHellos"] = { kind = 'client_stream', handler = function(_, server_view, ctx) local handler = impl.CollectHellos if handler == nil then error("Greeter.CollectHellos: handler missing", 0) end local wrapped = pb.grpc.wrap_server_view(server_view, M.HelloRequest_decode, nil) local resp = handler(wrapped, ctx) if resp == nil then error("Greeter.CollectHellos: handler returned nil response", 0) end server_view:send(M.HelloReply_encode(resp)) end, }, -- Bidirectional: both sides push and pull independently. ["/hello.Greeter/Chat"] = { kind = 'bidi', handler = function(_, server_view, ctx) local handler = impl.Chat if handler == nil then error("Greeter.Chat: handler missing", 0) end local wrapped = pb.grpc.wrap_server_view(server_view, M.HelloRequest_decode, M.HelloReply_encode) handler(wrapped, ctx) end, }, }, } end return M