aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-03-31 12:40:39 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-03-31 12:40:39 +0300
commite12f638e822c010126232846c09136e5e2b7f6d8 (patch)
treeb39f2af7cf8eae38f9cea763679c7565223d04cf
parent9ad3652425777de5d09aefe74c3f0166d92a87fe (diff)
downloadnimpb-e12f638e822c010126232846c09136e5e2b7f6d8.tar.gz
nimpb-e12f638e822c010126232846c09136e5e2b7f6d8.zip
Generate serialize/deserialize convenience procs
-rw-r--r--src/protobuf/gen.nim31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/protobuf/gen.nim b/src/protobuf/gen.nim
index acf9504..ed6ee5a 100644
--- a/src/protobuf/gen.nim
+++ b/src/protobuf/gen.nim
@@ -544,6 +544,35 @@ proc generateSizeOfMessageProc(desc: NimNode): NimNode =
asgn[1] = infix(asgn[1], "+", newCall(ident("sizeOfUint64"),
sizeOfFieldId))
+proc generateSerializeProc(desc: NimNode): NimNode =
+ let
+ mtype = ident(getMessageName(desc))
+ procName = postfix(ident("serialize"), "*")
+ writer = ident("write" & getMessageName(desc))
+ resultId = ident("result")
+
+ result = quote do:
+ proc `procName`(message: `mtype`): string =
+ let
+ ss = newStringStream()
+ pbs = newProtobufStream(ss)
+ `writer`(pbs, message)
+ `resultId` = ss.data
+
+proc generateDeserializeProc(desc: NimNode): NimNode =
+ let
+ mtype = ident(getMessageName(desc))
+ procName = postfix(ident("new" & getMessageName(desc)), "*")
+ reader = ident("read" & getMessageName(desc))
+ resultId = ident("result")
+
+ result = quote do:
+ proc `procName`(data: string): `mtype` =
+ let
+ ss = newStringStream(data)
+ pbs = newProtobufStream(ss)
+ `resultId` = `reader`(pbs)
+
macro generateMessageProcs*(x: typed): typed =
let
desc = getImpl(symbol(x))
@@ -563,6 +592,8 @@ macro generateMessageProcs*(x: typed): typed =
add(result, generateWriteMessageProc(desc))
add(result, generateReadMessageProc(desc))
add(result, generateSizeOfMessageProc(desc))
+ add(result, generateSerializeProc(desc))
+ add(result, generateDeserializeProc(desc))
when defined(debug):
hint(repr(result))