Commit 7ceb01b3 authored by oroulet's avatar oroulet Committed by oroulet

clean Enum var name before generating code

parent a871aff0
......@@ -117,34 +117,35 @@ def get_default_value(uatype, enums=None):
return f"ua.{uatype}()"
def make_structure_code(data_type, name, sdef):
def make_structure_code(data_type, struct_name, sdef):
"""
given a StructureDefinition object, generate Python code
"""
if sdef.StructureType not in (ua.StructureType.Structure, ua.StructureType.StructureWithOptionalFields):
# if sdef.StructureType != ua.StructureType.Structure:
raise NotImplementedError(f"Only StructureType implemented, not {ua.StructureType(sdef.StructureType).name} for node {name} with DataTypdeDefinition {sdef}")
raise NotImplementedError(f"Only StructureType implemented, not {ua.StructureType(sdef.StructureType).name} for node {struct_name} with DataTypdeDefinition {sdef}")
code = f"""
class {name}:
class {struct_name}:
'''
{name} structure autogenerated from StructureDefinition object
{struct_name} structure autogenerated from StructureDefinition object
'''
data_type = ua.NodeId({data_type.Identifier}, {data_type.NamespaceIndex})
"""
counter = 0
# FIXME: with subscturutre weprobably need to add all fields from parents
# FIXME: to support inheritance we probably need to add all fields from parents
# this requires network call etc...
if sdef.StructureType == ua.StructureType.StructureWithOptionalFields:
code += ' ua_switches = {\n'
for field in sdef.Fields:
fname = clean_name(field.Name)
if field.IsOptional:
code += f" '{field.Name}': ('Encoding', {counter}),\n"
code += f" '{fname}': ('Encoding', {counter}),\n"
counter += 1
code += " }\n\n"
......@@ -153,6 +154,7 @@ class {name}:
code += " ('Encoding', 'Byte'),\n"
uatypes = []
for field in sdef.Fields:
fname = clean_name(field.Name)
prefix = ""
if field.ValueRank >= 1 or field.ArrayDimensions:
prefix = 'ListOf'
......@@ -165,16 +167,16 @@ class {name}:
else:
# FIXME: we are probably missing many custom tyes here based on builtin types
# maybe we can use ua_utils.get_base_data_type()
raise RuntimeError(f"Unknown datatype for field: {field} in structure:{name}, please report")
raise RuntimeError(f"Unknown datatype for field: {field} in structure:{struct_name}, please report")
if field.ValueRank >= 1 and uatype == 'Char':
uatype = 'String'
uatypes.append((field, uatype))
code += f" ('{field.Name}', '{prefix + uatype}'),\n"
code += f" ('{fname}', '{prefix + uatype}'),\n"
code += " ]\n"
code += f"""
def __str__(self):
vals = [f"{{name}}:{{val}}" for name, val in self.__dict__.items()]
return f"{name}({{','.join(vals)}})"
vals = [f"{{field_name}}:{{val}}" for field_name, val in self.__dict__.items()]
return f"{struct_name}({{','.join(vals)}})"
__repr__ = __str__
......@@ -185,11 +187,12 @@ class {name}:
if sdef.StructureType == ua.StructureType.StructureWithOptionalFields:
code += " self.Encoding = 0\n"
for field, uatype in uatypes:
fname = clean_name(field.Name)
if field.ValueRank >= 1:
default_value = "[]"
else:
default_value = get_default_value(uatype)
code += f" self.{field.Name} = {default_value}\n"
code += f" self.{fname} = {default_value}\n"
return code
......@@ -304,7 +307,7 @@ class {name}(IntEnum):
"""
for field in edef.Fields:
name = field.Name
name = clean_name(field.Name)
value = field.Value
code += f" {name} = {value}\n"
......@@ -315,10 +318,10 @@ async def load_enums(server, base_node=None):
if base_node is None:
base_node = server.nodes.enum_data_type
for desc in await base_node.get_children_descriptions(refs=ua.ObjectIds.HasSubtype):
if hasattr(ua, desc.BrowseName.Name):
continue
logger.warning("Registring Enum %s %s", desc.NodeId, desc.BrowseName)
name = clean_name(desc.BrowseName.Name)
if hasattr(ua, name):
continue
logger.warning("Registring Enum %s %s", desc.NodeId, name)
edef = await _read_data_type_definition(server, desc)
if not edef:
continue
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment