-- 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 CHARS = wire.CHARS
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<string, integer> @ Map fields (M2)
---@field nickname_by_age table<integer, string>
---@field addresses_by_label table<string, hello.Address>
---@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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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 _n = #v
local parts, m = table_new(_n, 0), 0
for _i = 1, _n do
local _e = v[_i]
if type(_e) == 'number' and _e >= 0 and _e < 128 then
m = m + 1; parts[m] = CHARS[_e]
else
m = m + 1; parts[m] = encode_int32(_e)
end
end
local _b = table.concat(parts)
n = n + 1; out[n] = "\x3a"
local _len = #_b
if _len < 128 then
n = n + 1; out[n] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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] = CHARS[_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