aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-17 21:56:05 +0100
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-17 21:56:05 +0100
commit55f3a493871306ac220071574e2a5897851bef54 (patch)
tree509140ba0ccb8c675520368f08d578d33c90f7a7 /examples
parent55811e0f5467257a7f86fd474e4c6e234c2efa7b (diff)
downloadnimpb-55f3a493871306ac220071574e2a5897851bef54.tar.gz
nimpb-55f3a493871306ac220071574e2a5897851bef54.zip
Update examples
Diffstat (limited to 'examples')
-rw-r--r--examples/addressbook/Makefile14
-rw-r--r--examples/addressbook/addressbook_pb.nim135
-rw-r--r--examples/addressbook/nim.cfg2
-rw-r--r--examples/addressbook/phonenumber_pb.nim59
-rw-r--r--examples/addressbook/reader.nim2
-rw-r--r--examples/addressbook/writer.nim2
-rw-r--r--examples/simple/Makefile8
-rw-r--r--examples/simple/simple_pb.nim59
8 files changed, 160 insertions, 121 deletions
diff --git a/examples/addressbook/Makefile b/examples/addressbook/Makefile
index 74d41e1..6dbba14 100644
--- a/examples/addressbook/Makefile
+++ b/examples/addressbook/Makefile
@@ -1,12 +1,10 @@
-PLUGIN = ../../generator/protoc_gen_nim
-
all: writer reader
-writer: writer.nim addressbook_pb.nim
- nim c writer.nim
+writer: writer.nim addressbook_pb.nim phonenumber_pb.nim
+ nim c $<
-reader: reader.nim addressbook_pb.nim
- nim c reader.nim
+reader: reader.nim addressbook_pb.nim phonenumber_pb.nim
+ nim c $<
-addressbook_pb.nim: addressbook.proto phonenumber.proto
- protoc --plugin=protoc-gen-nim=$(PLUGIN) --nim_out=. -I. addressbook.proto phonenumber.proto
+%_pb.nim: %.proto
+ nimpb_build -I. --out=. $<
diff --git a/examples/addressbook/addressbook_pb.nim b/examples/addressbook/addressbook_pb.nim
index d2255fe..9e863a0 100644
--- a/examples/addressbook/addressbook_pb.nim
+++ b/examples/addressbook/addressbook_pb.nim
@@ -1,37 +1,42 @@
# Generated by protoc_gen_nim. Do not edit!
+import base64
import intsets
+import json
import nimpb/nimpb
+import nimpb/json as nimpb_json
import phonenumber_pb
type
Person* = ref PersonObj
- PersonObj* = object of RootObj
- hasField: IntSet
+ PersonObj* = object of Message
name: string
id: int32
email: string
phones: seq[PhoneNumber]
AddressBook* = ref AddressBookObj
- AddressBookObj* = object of RootObj
- hasField: IntSet
+ AddressBookObj* = object of Message
people: seq[Person]
proc newPerson*(): Person
-proc writePerson*(stream: ProtobufStream, message: Person)
-proc readPerson*(stream: ProtobufStream): Person
+proc newPerson*(data: string): Person
+proc writePerson*(stream: Stream, message: Person)
+proc readPerson*(stream: Stream): Person
proc sizeOfPerson*(message: Person): uint64
+proc toJson*(message: Person): JsonNode
proc newAddressBook*(): AddressBook
-proc writeAddressBook*(stream: ProtobufStream, message: AddressBook)
-proc readAddressBook*(stream: ProtobufStream): AddressBook
+proc newAddressBook*(data: string): AddressBook
+proc writeAddressBook*(stream: Stream, message: AddressBook)
+proc readAddressBook*(stream: Stream): AddressBook
proc sizeOfAddressBook*(message: AddressBook): uint64
+proc toJson*(message: AddressBook): JsonNode
proc newPerson*(): Person =
new(result)
- result.hasField = initIntSet()
+ initMessage(result[])
result.name = ""
result.id = 0
result.email = ""
@@ -39,14 +44,14 @@ proc newPerson*(): Person =
proc clearname*(message: Person) =
message.name = ""
- excl(message.hasField, [1])
+ clearFields(message, [1])
proc hasname*(message: Person): bool =
- result = contains(message.hasField, 1)
+ result = hasField(message, 1)
proc setname*(message: Person, value: string) =
message.name = value
- incl(message.hasField, 1)
+ setField(message, 1)
proc name*(message: Person): string {.inline.} =
message.name
@@ -56,14 +61,14 @@ proc `name=`*(message: Person, value: string) {.inline.} =
proc clearid*(message: Person) =
message.id = 0
- excl(message.hasField, [2])
+ clearFields(message, [2])
proc hasid*(message: Person): bool =
- result = contains(message.hasField, 2)
+ result = hasField(message, 2)
proc setid*(message: Person, value: int32) =
message.id = value
- incl(message.hasField, 2)
+ setField(message, 2)
proc id*(message: Person): int32 {.inline.} =
message.id
@@ -73,14 +78,14 @@ proc `id=`*(message: Person, value: int32) {.inline.} =
proc clearemail*(message: Person) =
message.email = ""
- excl(message.hasField, [3])
+ clearFields(message, [3])
proc hasemail*(message: Person): bool =
- result = contains(message.hasField, 3)
+ result = hasField(message, 3)
proc setemail*(message: Person, value: string) =
message.email = value
- incl(message.hasField, 3)
+ setField(message, 3)
proc email*(message: Person): string {.inline.} =
message.email
@@ -90,18 +95,18 @@ proc `email=`*(message: Person, value: string) {.inline.} =
proc clearphones*(message: Person) =
message.phones = @[]
- excl(message.hasField, [4])
+ clearFields(message, [4])
proc hasphones*(message: Person): bool =
- result = contains(message.hasField, 4) or (len(message.phones) > 0)
+ result = hasField(message, 4) or (len(message.phones) > 0)
proc setphones*(message: Person, value: seq[PhoneNumber]) =
message.phones = value
- incl(message.hasField, 4)
+ setField(message, 4)
proc addphones*(message: Person, value: PhoneNumber) =
add(message.phones, value)
- incl(message.hasField, 4)
+ setField(message, 4)
proc phones*(message: Person): seq[PhoneNumber] {.inline.} =
message.phones
@@ -122,18 +127,20 @@ proc sizeOfPerson*(message: Person): uint64 =
for value in message.phones:
result = result + sizeOfTag(4, WireType.LengthDelimited)
result = result + sizeOfLengthDelimited(sizeOfPhoneNumber(value))
+ result = result + sizeOfUnknownFields(message)
-proc writePerson*(stream: ProtobufStream, message: Person) =
+proc writePerson*(stream: Stream, message: Person) =
if hasname(message):
- writeString(stream, message.name, 1)
+ protoWriteString(stream, message.name, 1)
if hasid(message):
- writeInt32(stream, message.id, 2)
+ protoWriteInt32(stream, message.id, 2)
if hasemail(message):
- writeString(stream, message.email, 3)
+ protoWriteString(stream, message.email, 3)
for value in message.phones:
writeMessage(stream, value, 4)
+ writeUnknownFields(stream, message)
-proc readPerson*(stream: ProtobufStream): Person =
+proc readPerson*(stream: Stream): Person =
result = newPerson()
while not atEnd(stream):
let
@@ -144,55 +151,64 @@ proc readPerson*(stream: ProtobufStream): Person =
raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
expectWireType(wireType, WireType.LengthDelimited)
- setname(result, readString(stream))
+ setname(result, protoReadString(stream))
of 2:
expectWireType(wireType, WireType.Varint)
- setid(result, readInt32(stream))
+ setid(result, protoReadInt32(stream))
of 3:
expectWireType(wireType, WireType.LengthDelimited)
- setemail(result, readString(stream))
+ setemail(result, protoReadString(stream))
of 4:
expectWireType(wireType, WireType.LengthDelimited)
- let
- size = readVarint(stream)
- data = safeReadStr(stream, int(size))
- pbs = newProtobufStream(newStringStream(data))
- addphones(result, readPhoneNumber(pbs))
- else: skipField(stream, wireType)
+ let data = readLengthDelimited(stream)
+ addphones(result, newPhoneNumber(data))
+ else: readUnknownField(stream, result, tag)
+
+proc toJson*(message: Person): JsonNode =
+ result = newJObject()
+ if hasname(message):
+ result["name"] = %message.name
+ if hasid(message):
+ result["id"] = %message.id
+ if hasemail(message):
+ result["email"] = %message.email
+ if hasphones(message):
+ let arr = newJArray()
+ for value in message.phones:
+ add(arr, toJson(value))
+ result["phones"] = arr
proc serialize*(message: Person): string =
let
ss = newStringStream()
- pbs = newProtobufStream(ss)
- writePerson(pbs, message)
+ writePerson(ss, message)
result = ss.data
proc newPerson*(data: string): Person =
let
ss = newStringStream(data)
- pbs = newProtobufStream(ss)
- result = readPerson(pbs)
+ result = readPerson(ss)
proc newAddressBook*(): AddressBook =
new(result)
- result.hasField = initIntSet()
+ initMessage(result[])
result.people = @[]
proc clearpeople*(message: AddressBook) =
message.people = @[]
- excl(message.hasField, [1])
+ clearFields(message, [1])
proc haspeople*(message: AddressBook): bool =
- result = contains(message.hasField, 1) or (len(message.people) > 0)
+ result = hasField(message, 1) or (len(message.people) > 0)
proc setpeople*(message: AddressBook, value: seq[Person]) =
message.people = value
- incl(message.hasField, 1)
+ setField(message, 1)
proc addpeople*(message: AddressBook, value: Person) =
add(message.people, value)
- incl(message.hasField, 1)
+ setField(message, 1)
proc people*(message: AddressBook): seq[Person] {.inline.} =
message.people
@@ -204,12 +220,14 @@ proc sizeOfAddressBook*(message: AddressBook): uint64 =
for value in message.people:
result = result + sizeOfTag(1, WireType.LengthDelimited)
result = result + sizeOfLengthDelimited(sizeOfPerson(value))
+ result = result + sizeOfUnknownFields(message)
-proc writeAddressBook*(stream: ProtobufStream, message: AddressBook) =
+proc writeAddressBook*(stream: Stream, message: AddressBook) =
for value in message.people:
writeMessage(stream, value, 1)
+ writeUnknownFields(stream, message)
-proc readAddressBook*(stream: ProtobufStream): AddressBook =
+proc readAddressBook*(stream: Stream): AddressBook =
result = newAddressBook()
while not atEnd(stream):
let
@@ -220,24 +238,27 @@ proc readAddressBook*(stream: ProtobufStream): AddressBook =
raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
expectWireType(wireType, WireType.LengthDelimited)
- let
- size = readVarint(stream)
- data = safeReadStr(stream, int(size))
- pbs = newProtobufStream(newStringStream(data))
- addpeople(result, readPerson(pbs))
- else: skipField(stream, wireType)
+ let data = readLengthDelimited(stream)
+ addpeople(result, newPerson(data))
+ else: readUnknownField(stream, result, tag)
+
+proc toJson*(message: AddressBook): JsonNode =
+ result = newJObject()
+ if haspeople(message):
+ let arr = newJArray()
+ for value in message.people:
+ add(arr, toJson(value))
+ result["people"] = arr
proc serialize*(message: AddressBook): string =
let
ss = newStringStream()
- pbs = newProtobufStream(ss)
- writeAddressBook(pbs, message)
+ writeAddressBook(ss, message)
result = ss.data
proc newAddressBook*(data: string): AddressBook =
let
ss = newStringStream(data)
- pbs = newProtobufStream(ss)
- result = readAddressBook(pbs)
+ result = readAddressBook(ss)
diff --git a/examples/addressbook/nim.cfg b/examples/addressbook/nim.cfg
index 11736fc..1c2f0c1 100644
--- a/examples/addressbook/nim.cfg
+++ b/examples/addressbook/nim.cfg
@@ -1 +1 @@
---path:"../../src"
+--path:"../.."
diff --git a/examples/addressbook/phonenumber_pb.nim b/examples/addressbook/phonenumber_pb.nim
index b09f1a0..8b03f00 100644
--- a/examples/addressbook/phonenumber_pb.nim
+++ b/examples/addressbook/phonenumber_pb.nim
@@ -1,8 +1,11 @@
# Generated by protoc_gen_nim. Do not edit!
+import base64
import intsets
+import json
import nimpb/nimpb
+import nimpb/json as nimpb_json
type
PhoneType* {.pure.} = enum
@@ -10,32 +13,33 @@ type
HOME = 1
WORK = 2
PhoneNumber* = ref PhoneNumberObj
- PhoneNumberObj* = object of RootObj
- hasField: IntSet
+ PhoneNumberObj* = object of Message
number: string
ftype: PhoneType
proc newPhoneNumber*(): PhoneNumber
-proc writePhoneNumber*(stream: ProtobufStream, message: PhoneNumber)
-proc readPhoneNumber*(stream: ProtobufStream): PhoneNumber
+proc newPhoneNumber*(data: string): PhoneNumber
+proc writePhoneNumber*(stream: Stream, message: PhoneNumber)
+proc readPhoneNumber*(stream: Stream): PhoneNumber
proc sizeOfPhoneNumber*(message: PhoneNumber): uint64
+proc toJson*(message: PhoneNumber): JsonNode
proc newPhoneNumber*(): PhoneNumber =
new(result)
- result.hasField = initIntSet()
+ initMessage(result[])
result.number = ""
- result.ftype = PhoneType(0)
+ result.ftype = PhoneType.MOBILE
proc clearnumber*(message: PhoneNumber) =
message.number = ""
- excl(message.hasField, [1])
+ clearFields(message, [1])
proc hasnumber*(message: PhoneNumber): bool =
- result = contains(message.hasField, 1)
+ result = hasField(message, 1)
proc setnumber*(message: PhoneNumber, value: string) =
message.number = value
- incl(message.hasField, 1)
+ setField(message, 1)
proc number*(message: PhoneNumber): string {.inline.} =
message.number
@@ -44,15 +48,15 @@ proc `number=`*(message: PhoneNumber, value: string) {.inline.} =
setnumber(message, value)
proc clearftype*(message: PhoneNumber) =
- message.ftype = PhoneType(0)
- excl(message.hasField, [2])
+ message.ftype = PhoneType.MOBILE
+ clearFields(message, [2])
proc hasftype*(message: PhoneNumber): bool =
- result = contains(message.hasField, 2)
+ result = hasField(message, 2)
proc setftype*(message: PhoneNumber, value: PhoneType) =
message.ftype = value
- incl(message.hasField, 2)
+ setField(message, 2)
proc ftype*(message: PhoneNumber): PhoneType {.inline.} =
message.ftype
@@ -67,14 +71,16 @@ proc sizeOfPhoneNumber*(message: PhoneNumber): uint64 =
if hasftype(message):
result = result + sizeOfTag(2, WireType.Varint)
result = result + sizeOfEnum[PhoneType](message.ftype)
+ result = result + sizeOfUnknownFields(message)
-proc writePhoneNumber*(stream: ProtobufStream, message: PhoneNumber) =
+proc writePhoneNumber*(stream: Stream, message: PhoneNumber) =
if hasnumber(message):
- writeString(stream, message.number, 1)
+ protoWriteString(stream, message.number, 1)
if hasftype(message):
- writeEnum(stream, message.ftype, 2)
+ protoWriteEnum(stream, message.ftype, 2)
+ writeUnknownFields(stream, message)
-proc readPhoneNumber*(stream: ProtobufStream): PhoneNumber =
+proc readPhoneNumber*(stream: Stream): PhoneNumber =
result = newPhoneNumber()
while not atEnd(stream):
let
@@ -85,23 +91,28 @@ proc readPhoneNumber*(stream: ProtobufStream): PhoneNumber =
raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
expectWireType(wireType, WireType.LengthDelimited)
- setnumber(result, readString(stream))
+ setnumber(result, protoReadString(stream))
of 2:
expectWireType(wireType, WireType.Varint)
- setftype(result, readEnum[PhoneType](stream))
- else: skipField(stream, wireType)
+ setftype(result, protoReadEnum[PhoneType](stream))
+ else: readUnknownField(stream, result, tag)
+
+proc toJson*(message: PhoneNumber): JsonNode =
+ result = newJObject()
+ if hasnumber(message):
+ result["number"] = %message.number
+ if hasftype(message):
+ result["type"] = %($message.ftype)
proc serialize*(message: PhoneNumber): string =
let
ss = newStringStream()
- pbs = newProtobufStream(ss)
- writePhoneNumber(pbs, message)
+ writePhoneNumber(ss, message)
result = ss.data
proc newPhoneNumber*(data: string): PhoneNumber =
let
ss = newStringStream(data)
- pbs = newProtobufStream(ss)
- result = readPhoneNumber(pbs)
+ result = readPhoneNumber(ss)
diff --git a/examples/addressbook/reader.nim b/examples/addressbook/reader.nim
index 6aa7f27..5a01439 100644
--- a/examples/addressbook/reader.nim
+++ b/examples/addressbook/reader.nim
@@ -6,7 +6,7 @@ import nimpb/nimpb
import addressbook_pb
import phonenumber_pb
-let pbsi = newProtobufStream(newFileStream("addressbook.dat"))
+let pbsi = newFileStream("addressbook.dat")
let addressBook = readAddressBook(pbsi)
diff --git a/examples/addressbook/writer.nim b/examples/addressbook/writer.nim
index cd1e488..bbdc451 100644
--- a/examples/addressbook/writer.nim
+++ b/examples/addressbook/writer.nim
@@ -34,5 +34,5 @@ setNumber(janePhone1, "1432")
setFType(janePhone1, HOME)
addPhones(jane, janePhone1)
-let pbso = newProtobufStream(newFileStream("addressbook.dat", fmWrite))
+let pbso = newFileStream("addressbook.dat", fmWrite)
writeAddressBook(pbso, addressBook)
diff --git a/examples/simple/Makefile b/examples/simple/Makefile
index ff24675..cec07f3 100644
--- a/examples/simple/Makefile
+++ b/examples/simple/Makefile
@@ -1,9 +1,7 @@
-PLUGIN = ../../generator/protoc_gen_nim
-
all: simple
simple: simple.nim simple_pb.nim
- nim c simple.nim
+ nim c $<
-simple_pb.nim: simple.proto
- protoc --plugin=protoc-gen-nim=$(PLUGIN) --nim_out=. -I. simple.proto
+%_pb.nim: %.proto
+ nimpb_build -I. --out=. $<
diff --git a/examples/simple/simple_pb.nim b/examples/simple/simple_pb.nim
index 0b1a056..56d4afb 100644
--- a/examples/simple/simple_pb.nim
+++ b/examples/simple/simple_pb.nim
@@ -1,40 +1,44 @@
# Generated by protoc_gen_nim. Do not edit!
+import base64
import intsets
+import json
import nimpb/nimpb
+import nimpb/json as nimpb_json
type
Test1_MyEnum* {.pure.} = enum
Foo = 0
Bar = 1
Test1* = ref Test1Obj
- Test1Obj* = object of RootObj
- hasField: IntSet
+ Test1Obj* = object of Message
a: int32
e: Test1_MyEnum
proc newTest1*(): Test1
-proc writeTest1*(stream: ProtobufStream, message: Test1)
-proc readTest1*(stream: ProtobufStream): Test1
+proc newTest1*(data: string): Test1
+proc writeTest1*(stream: Stream, message: Test1)
+proc readTest1*(stream: Stream): Test1
proc sizeOfTest1*(message: Test1): uint64
+proc toJson*(message: Test1): JsonNode
proc newTest1*(): Test1 =
new(result)
- result.hasField = initIntSet()
+ initMessage(result[])
result.a = 0
- result.e = Test1_MyEnum(0)
+ result.e = Test1_MyEnum.Foo
proc cleara*(message: Test1) =
message.a = 0
- excl(message.hasField, [1])
+ clearFields(message, [1])
proc hasa*(message: Test1): bool =
- result = contains(message.hasField, 1)
+ result = hasField(message, 1)
proc seta*(message: Test1, value: int32) =
message.a = value
- incl(message.hasField, 1)
+ setField(message, 1)
proc a*(message: Test1): int32 {.inline.} =
message.a
@@ -43,15 +47,15 @@ proc `a=`*(message: Test1, value: int32) {.inline.} =
seta(message, value)
proc cleare*(message: Test1) =
- message.e = Test1_MyEnum(0)
- excl(message.hasField, [2])
+ message.e = Test1_MyEnum.Foo
+ clearFields(message, [2])
proc hase*(message: Test1): bool =
- result = contains(message.hasField, 2)
+ result = hasField(message, 2)
proc sete*(message: Test1, value: Test1_MyEnum) =
message.e = value
- incl(message.hasField, 2)
+ setField(message, 2)
proc e*(message: Test1): Test1_MyEnum {.inline.} =
message.e
@@ -66,14 +70,16 @@ proc sizeOfTest1*(message: Test1): uint64 =
if hase(message):
result = result + sizeOfTag(2, WireType.Varint)
result = result + sizeOfEnum[Test1_MyEnum](message.e)
+ result = result + sizeOfUnknownFields(message)
-proc writeTest1*(stream: ProtobufStream, message: Test1) =
+proc writeTest1*(stream: Stream, message: Test1) =
if hasa(message):
- writeInt32(stream, message.a, 1)
+ protoWriteInt32(stream, message.a, 1)
if hase(message):
- writeEnum(stream, message.e, 2)
+ protoWriteEnum(stream, message.e, 2)
+ writeUnknownFields(stream, message)
-proc readTest1*(stream: ProtobufStream): Test1 =
+proc readTest1*(stream: Stream): Test1 =
result = newTest1()
while not atEnd(stream):
let
@@ -84,23 +90,28 @@ proc readTest1*(stream: ProtobufStream): Test1 =
raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
expectWireType(wireType, WireType.Varint)
- seta(result, readInt32(stream))
+ seta(result, protoReadInt32(stream))
of 2:
expectWireType(wireType, WireType.Varint)
- sete(result, readEnum[Test1_MyEnum](stream))
- else: skipField(stream, wireType)
+ sete(result, protoReadEnum[Test1_MyEnum](stream))
+ else: readUnknownField(stream, result, tag)
+
+proc toJson*(message: Test1): JsonNode =
+ result = newJObject()
+ if hasa(message):
+ result["a"] = %message.a
+ if hase(message):
+ result["e"] = %($message.e)
proc serialize*(message: Test1): string =
let
ss = newStringStream()
- pbs = newProtobufStream(ss)
- writeTest1(pbs, message)
+ writeTest1(ss, message)
result = ss.data
proc newTest1*(data: string): Test1 =
let
ss = newStringStream(data)
- pbs = newProtobufStream(ss)
- result = readTest1(pbs)
+ result = readTest1(ss)