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.
147 lines
3.6 KiB
147 lines
3.6 KiB
11 years ago
|
--
|
||
|
-- upb - a minimalist implementation of protocol buffers.
|
||
|
--
|
||
|
-- Copyright (c) 2009 Google Inc. See LICENSE for details.
|
||
|
-- Author: Josh Haberman <jhaberman@gmail.com>
|
||
|
--
|
||
|
-- Pure-Lua support functions that are part of the "upb" module.
|
||
|
-- This file is embedded and packaged into the "upb" C module binary -- it
|
||
|
-- should not be installed or used directly!
|
||
|
|
||
|
return function(upb)
|
||
|
-- 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 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
|
||
|
|
||
|
-- 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
|
||
|
end
|