general: add support for declaring enums as struct members
the enum types are resolved to the wiretypes for the benefit of c-loxi.
diff --git a/loxi_utils/loxi_utils.py b/loxi_utils/loxi_utils.py
index f5f9b63..601a65d 100644
--- a/loxi_utils/loxi_utils.py
+++ b/loxi_utils/loxi_utils.py
@@ -36,6 +36,7 @@
import sys
import of_g
import tenjin
+from generic_utils import find, memoize
def class_signature(members):
"""
@@ -517,6 +518,17 @@
with open(template_filename) as infile:
out.write(infile.read())
+@memoize
+def lookup_ir_wiretype(oftype, version):
+ """ if of is a reference to an enum in ir, resolve it to the wiretype
+ declared in that enum. Else return oftype """
+ enums = of_g.ir[version].enums
+ enum = find(lambda e: e.name == oftype, enums)
+ if enum and 'wire_type' in enum.params:
+ return enum.params['wire_type']
+ else:
+ return oftype
+
class TemplateEngine(tenjin.Engine):
def include(self, template_name, **kwargs):
"""
diff --git a/loxigen.py b/loxigen.py
index dcd547e..f756dc0 100755
--- a/loxigen.py
+++ b/loxigen.py
@@ -442,7 +442,11 @@
if m.oftype == 'of_oxm_t':
m_type = 'of_octets_t'
else:
- m_type = m.oftype
+ enum = find(lambda e: e.name == m.oftype, ofinput.enums)
+ if enum and "wire_type" in enum.params:
+ m_type = enum.params["wire_type"]
+ else:
+ m_type = m.oftype
legacy_members.append(dict(m_type=m_type, name=m.name))
versions[version_name]['classes'][ofclass.name] = legacy_members