From 2ec1080ac9bafeb193ab72c3504afa17831de6d3 Mon Sep 17 00:00:00 2001
From: Teon Banek <teon.banek@memgraph.io>
Date: Sun, 30 Jul 2017 20:23:09 +0200
Subject: [PATCH] Add pretty printer to gdb for TypedValue

Reviewers: florijan, mislav.bradac, buda

Reviewed By: mislav.bradac

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D619
---
 .gdbinit                             |  1 +
 tools/gdb-plugins/pretty_printers.py | 45 ++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 tools/gdb-plugins/pretty_printers.py

diff --git a/.gdbinit b/.gdbinit
index ecdae1764..fd30dcdc6 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -1 +1,2 @@
 source ./tools/gdb-plugins/operator_tree.py
+source ./tools/gdb-plugins/pretty_printers.py
diff --git a/tools/gdb-plugins/pretty_printers.py b/tools/gdb-plugins/pretty_printers.py
new file mode 100644
index 000000000..7545af029
--- /dev/null
+++ b/tools/gdb-plugins/pretty_printers.py
@@ -0,0 +1,45 @@
+import gdb
+import gdb.printing
+
+
+def build_memgraph_pretty_printers():
+    '''Instantiate and return all memgraph pretty printer classes.'''
+    pp = gdb.printing.RegexpCollectionPrettyPrinter('memgraph')
+    pp.add_printer('query::TypedValue', '^query::TypedValue$', TypedValuePrinter)
+    return pp
+
+
+class TypedValuePrinter(gdb.printing.PrettyPrinter):
+    '''Pretty printer for query::TypedValue'''
+    def __init__(self, val):
+        super(TypedValuePrinter, self).__init__('TypedValue')
+        self.val = val
+
+    def to_string(self):
+        def _to_str(val):
+            return '{%s %s}' % (value_type, self.val[val])
+        value_type = str(self.val['type_'])
+        if value_type == 'query::TypedValue::Type::Null':
+            return '{%s}' % value_type
+        elif value_type == 'query::TypedValue::Type::Bool':
+            return _to_str('bool_v')
+        elif value_type == 'query::TypedValue::Type::Int':
+            return _to_str('int_v')
+        elif value_type == 'query::TypedValue::Type::Double':
+            return _to_str('double_v')
+        elif value_type == 'query::TypedValue::Type::String':
+            return _to_str('string_v')
+        elif value_type == 'query::TypedValue::Type::List':
+            return _to_str('list_v')
+        elif value_type == 'query::TypedValue::Type::Map':
+            return _to_str('map_v')
+        elif value_type == 'query::TypedValue::Type::Vertex':
+            return _to_str('vertex_v')
+        elif value_type == 'query::TypedValue::Type::Edge':
+            return _to_str('edge_v')
+        elif value_type == 'query::TypedValue::Type::Path':
+            return _to_str('path_v')
+        return '{%s}' % value_type
+
+gdb.printing.register_pretty_printer(None, build_memgraph_pretty_printers(),
+                                     replace=True)