summaryrefslogtreecommitdiff
path: root/upb/bindings/lua/upb.lua
diff options
context:
space:
mode:
Diffstat (limited to 'upb/bindings/lua/upb.lua')
-rw-r--r--upb/bindings/lua/upb.lua146
1 files changed, 146 insertions, 0 deletions
diff --git a/upb/bindings/lua/upb.lua b/upb/bindings/lua/upb.lua
new file mode 100644
index 0000000..bda9dfe
--- /dev/null
+++ b/upb/bindings/lua/upb.lua
@@ -0,0 +1,146 @@
+--
+-- 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
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback