From e96cd5abe2a318994e1e5a8d6ea88b9401c671f4 Mon Sep 17 00:00:00 2001 From: Joey Date: Wed, 16 Sep 2020 10:06:58 -0600 Subject: [PATCH] Add objprint Add ability to print (ref) objects/tuples --- src/extensions/objprint.nim | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/extensions/objprint.nim diff --git a/src/extensions/objprint.nim b/src/extensions/objprint.nim new file mode 100644 index 0000000..099d87d --- /dev/null +++ b/src/extensions/objprint.nim @@ -0,0 +1,40 @@ +import strutils +import typetraits + +proc typeToStr[T](some: typedesc[T]): string = name(T) + +template tupleObjToStr(obj): string = + mixin typeToStr + var res = typeToStr(type(obj)) + template helper(n) {.gensym.} = + res.add("(") + var firstElement = true + for name, value in n.fieldPairs(): + when compiles(value): + if not firstElement: + res.add(", ") + res.add(name) + res.add(": ") + when (value is object or value is tuple): + when (value is tuple): + res.add("tuple " & typeToStr(type(value))) + else: + res.add(typeToStr(type(value))) + helper(value) + elif (value is string): + res.add("\"" & $value & "\"") + else: + res.add($value) + firstElement = false + res.add(")") + helper(obj) + res + +proc `$`*(s: object): string = + result = tupleObjToStr(s).replace(":ObjectType", "") + +proc `$`*(s: ref object): string = + result = "ref " & $s[] + +proc `$`*(s: tuple): string = + result = tupleObjToStr(s)