Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
4.0 KiB
172 lines
4.0 KiB
|
|
-- Before calling require on "upb_c", we need to load the same library |
|
-- as RTLD_GLOBAL, for the benefit of other C extensions that depend on |
|
-- C functions in the core. |
|
-- |
|
-- This has to happen *before* the require call, because if the module |
|
-- is loaded RTLD_LOCAL first, a subsequent load as RTLD_GLOBAL won't |
|
-- have the proper effect, at least on some platforms. |
|
local so = package.searchpath and package.searchpath("upb_c", package.cpath) |
|
if so then |
|
package.loadlib(so, "*") |
|
end |
|
|
|
local upb = require("upb_c") |
|
|
|
-- A convenience function for building/linking/freezing defs |
|
-- while maintaining their original order. |
|
-- |
|
-- Sample usage: |
|
-- local m1, m2 = upb.build_defs{ |
|
-- upb.MessageDef{full_name = "M1", fields = { |
|
-- upb.FieldDef{ |
|
-- name = "m2", |
|
-- number = 1, |
|
-- type = upb.TYPE_MESSAGE, |
|
-- subdef_name = ".M2" |
|
-- }, |
|
-- } |
|
-- }, |
|
-- upb.MessageDef{full_name = "M2"} |
|
-- } |
|
upb.build_defs = function(defs) |
|
upb.SymbolTable(defs) |
|
-- Lua 5.2 puts unpack in the table library. |
|
return (unpack or table.unpack)(defs) |
|
end |
|
|
|
local ipairs_iter = function(array, last_index) |
|
local next_index = last_index + 1 |
|
if next_index > #array then |
|
return nil |
|
end |
|
return next_index, array[next_index] |
|
end |
|
|
|
-- For iterating over the indexes and values of a upb.Array. |
|
-- |
|
-- for i, val in upb.ipairs(array) do |
|
-- -- ... |
|
-- end |
|
upb.ipairs = function(array) |
|
return ipairs_iter, array, 0 |
|
end |
|
|
|
local set_named = function(obj, init) |
|
for k, v in pairs(init) do |
|
local func = obj["set_" .. k] |
|
if not func then |
|
error("Cannot set member: " .. k) |
|
end |
|
func(obj, v) |
|
end |
|
end |
|
|
|
-- Capture references to the functions we're wrapping. |
|
local RealFieldDef = upb.FieldDef |
|
local RealEnumDef = upb.EnumDef |
|
local RealMessageDef = upb.MessageDef |
|
local RealOneofDef = upb.OneofDef |
|
local RealSymbolTable = upb.SymbolTable |
|
|
|
-- FieldDef constructor; a wrapper around the real constructor that can |
|
-- set initial properties. |
|
-- |
|
-- User can specify initialization values like so: |
|
-- upb.FieldDef{label=upb.LABEL_REQUIRED, name="my_field", number=5, |
|
-- type=upb.TYPE_INT32, default_value=12, type_name="Foo"} |
|
upb.FieldDef = function(init) |
|
local f = RealFieldDef() |
|
|
|
if init then |
|
-- Other members are often dependent on type, so set that first. |
|
if init.type then |
|
f:set_type(init.type) |
|
init.type = nil |
|
end |
|
|
|
set_named(f, init) |
|
end |
|
|
|
return f |
|
end |
|
|
|
|
|
-- MessageDef constructor; a wrapper around the real constructor that can |
|
-- set initial properties. |
|
-- |
|
-- User can specify initialization values like so: |
|
-- upb.MessageDef{full_name="MyMessage", extstart=8000, fields={...}} |
|
upb.MessageDef = function(init) |
|
local m = RealMessageDef() |
|
|
|
if init then |
|
for _, f in pairs(init.fields or {}) do |
|
m:add(f) |
|
end |
|
init.fields = nil |
|
|
|
set_named(m, init) |
|
end |
|
|
|
return m |
|
end |
|
|
|
-- EnumDef constructor; a wrapper around the real constructor that can |
|
-- set initial properties. |
|
-- |
|
-- User can specify initialization values like so: |
|
-- upb.EnumDef{full_name="MyEnum", |
|
-- values={ |
|
-- {"FOO_VALUE_1", 1}, |
|
-- {"FOO_VALUE_2", 2} |
|
-- } |
|
-- } |
|
upb.EnumDef = function(init) |
|
local e = RealEnumDef() |
|
|
|
if init then |
|
for _, val in pairs(init.values or {}) do |
|
e:add(val[1], val[2]) |
|
end |
|
init.values = nil |
|
|
|
set_named(e, init) |
|
end |
|
|
|
return e |
|
end |
|
|
|
-- OneofDef constructor; a wrapper around the real constructor that can |
|
-- set initial properties. |
|
-- |
|
-- User can specify initialization values like so: |
|
-- upb.OneofDef{name="foo", fields={...}} |
|
upb.OneofDef = function(init) |
|
local o = RealOneofDef() |
|
|
|
if init then |
|
for _, val in pairs(init.fields or {}) do |
|
o:add(val) |
|
end |
|
init.fields = nil |
|
|
|
set_named(o, init) |
|
end |
|
|
|
return o |
|
end |
|
|
|
-- SymbolTable constructor; a wrapper around the real constructor that can |
|
-- add an initial set of defs. |
|
upb.SymbolTable = function(defs) |
|
local s = RealSymbolTable() |
|
|
|
if defs then |
|
s:add(defs) |
|
end |
|
|
|
return s |
|
end |
|
|
|
return upb
|
|
|