# WARNING: This is till work in progress
#
# Load into gdb with 'source ../tools/gdb-prettyprint.py'
# Make sure to also apply 'set print pretty on' to get nice structure printouts

class String:
    def __init__(self, val):
        self.val = val

    def to_string (self):
        length = int(self.val['length'])
        data = self.val['data']

        if int(data) == 0:
            return "UA_STRING_NULL"
        inferior = gdb.selected_inferior()
        text = inferior.read_memory(data, length).tobytes().decode(errors='replace')
        return "\"%s\"" % text

class LocalizedText:
    def __init__(self, val):
        self.val = val

    def to_string (self):
        return "UA_LocalizedText(%s, %s)" % (self.val['locale'], self.val['text'])

class QualifiedName:
    def __init__(self, val):
        self.val = val

    def to_string (self):
        return "UA_QualifiedName(%s, %s)" % (int(self.val['namespaceIndex']), self.val['name'])

class Guid:
    def __init__(self, val):
        self.val = val

    def to_string (self):
        return "UA_Guid()"

class NodeId:
    def __init__(self, val):
        self.val = val

    def to_string (self):
        return "UA_NodeId()"

class Variant:
    def __init__(self, val):
        self.val = val

    def to_string (self):
        return "UA_Variant()"

def lookup_type (val):
    if str(val.type) == 'UA_String':
        return String(val)
    if str(val.type) == 'UA_LocalizedText':
        return LocalizedText(val)
    if str(val.type) == 'UA_QualifiedName':
        return QualifiedName(val)
    if str(val.type) == 'UA_Guid':
        return Guid(val)
    if str(val.type) == 'UA_NodeId':
        return NodeId(val)
    if str(val.type) == 'UA_Variant':
        return Variant(val)
    return None

gdb.pretty_printers.append (lookup_type)

add a first draft for a gdb pretty-printer