aboutsummaryrefslogtreecommitdiff
path: root/examples/addressbook
diff options
context:
space:
mode:
Diffstat (limited to 'examples/addressbook')
-rw-r--r--examples/addressbook/addressbook_pb.nim91
-rw-r--r--examples/addressbook/phonenumber_pb.nim37
-rw-r--r--examples/addressbook/reader.nim2
-rw-r--r--examples/addressbook/writer.nim2
4 files changed, 67 insertions, 65 deletions
diff --git a/examples/addressbook/addressbook_pb.nim b/examples/addressbook/addressbook_pb.nim
index 6ec734a..f145fa3 100644
--- a/examples/addressbook/addressbook_pb.nim
+++ b/examples/addressbook/addressbook_pb.nim
@@ -2,8 +2,7 @@
import intsets
-import protobuf/stream
-import protobuf/types
+import protobuf/protobuf
import phonenumber_pb
@@ -20,6 +19,16 @@ type
hasField: IntSet
people: seq[Person]
+proc newPerson*(): Person
+proc writePerson*(stream: ProtobufStream, message: Person)
+proc readPerson*(stream: ProtobufStream): Person
+proc sizeOfPerson*(message: Person): uint64
+
+proc newAddressBook*(): AddressBook
+proc writeAddressBook*(stream: ProtobufStream, message: AddressBook)
+proc readAddressBook*(stream: ProtobufStream): AddressBook
+proc sizeOfAddressBook*(message: AddressBook): uint64
+
proc newPerson*(): Person =
new(result)
result.hasField = initIntSet()
@@ -30,7 +39,7 @@ proc newPerson*(): Person =
proc clearname*(message: Person) =
message.name = ""
- excl(message.hasField, 1)
+ excl(message.hasField, [1])
proc hasname*(message: Person): bool =
result = contains(message.hasField, 1)
@@ -47,7 +56,7 @@ proc `name=`*(message: Person, value: string) {.inline.} =
proc clearid*(message: Person) =
message.id = 0
- excl(message.hasField, 2)
+ excl(message.hasField, [2])
proc hasid*(message: Person): bool =
result = contains(message.hasField, 2)
@@ -64,7 +73,7 @@ proc `id=`*(message: Person, value: int32) {.inline.} =
proc clearemail*(message: Person) =
message.email = ""
- excl(message.hasField, 3)
+ excl(message.hasField, [3])
proc hasemail*(message: Person): bool =
result = contains(message.hasField, 3)
@@ -81,10 +90,10 @@ proc `email=`*(message: Person, value: string) {.inline.} =
proc clearphones*(message: Person) =
message.phones = @[]
- excl(message.hasField, 4)
+ excl(message.hasField, [4])
proc hasphones*(message: Person): bool =
- result = contains(message.hasField, 4)
+ result = contains(message.hasField, 4) or (len(message.phones) > 0)
proc setphones*(message: Person, value: seq[PhoneNumber]) =
message.phones = value
@@ -102,42 +111,27 @@ proc `phones=`*(message: Person, value: seq[PhoneNumber]) {.inline.} =
proc sizeOfPerson*(message: Person): uint64 =
if hasname(message):
- let
- sizeOfField = sizeOfString(message.name)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(1, WireType.LengthDelimited)))
- result = result + sizeOfField + sizeOfTag
+ result = result + sizeOfTag(1, WireType.LengthDelimited)
+ result = result + sizeOfString(message.name)
if hasid(message):
- let
- sizeOfField = sizeOfInt32(message.id)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(2, WireType.Varint)))
- result = result + sizeOfField + sizeOfTag
+ result = result + sizeOfTag(2, WireType.Varint)
+ result = result + sizeOfInt32(message.id)
if hasemail(message):
- let
- sizeOfField = sizeOfString(message.email)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(3, WireType.LengthDelimited)))
- result = result + sizeOfField + sizeOfTag
+ result = result + sizeOfTag(3, WireType.LengthDelimited)
+ result = result + sizeOfString(message.email)
for value in message.phones:
- let
- sizeOfValue = sizeOfPhoneNumber(value)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(4, WireType.LengthDelimited)))
- result = result + sizeOfValue + sizeOfTag
-
- result = result + sizeOfUInt64(sizeOfValue)
+ result = result + sizeOfTag(4, WireType.LengthDelimited)
+ result = result + sizeOfLengthDelimited(sizeOfPhoneNumber(value))
proc writePerson*(stream: ProtobufStream, message: Person) =
if hasname(message):
- writeTag(stream, 1, WireType.LengthDelimited)
- writeString(stream, message.name)
+ writeString(stream, message.name, 1)
if hasid(message):
- writeTag(stream, 2, WireType.Varint)
- writeInt32(stream, message.id)
+ writeInt32(stream, message.id, 2)
if hasemail(message):
- writeTag(stream, 3, WireType.LengthDelimited)
- writeString(stream, message.email)
+ writeString(stream, message.email, 3)
for value in message.phones:
- writeTag(stream, 4, WireType.LengthDelimited)
- writeVarint(stream, sizeOfPhoneNumber(value))
- writePhoneNumber(stream, value)
+ writeMessage(stream, value, 4)
proc readPerson*(stream: ProtobufStream): Person =
result = newPerson()
@@ -146,16 +140,22 @@ proc readPerson*(stream: ProtobufStream): Person =
tag = readTag(stream)
wireType = getTagWireType(tag)
case getTagFieldNumber(tag)
+ of 0:
+ raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
+ expectWireType(wireType, WireType.LengthDelimited)
setname(result, readString(stream))
of 2:
+ expectWireType(wireType, WireType.Varint)
setid(result, readInt32(stream))
of 3:
+ expectWireType(wireType, WireType.LengthDelimited)
setemail(result, readString(stream))
of 4:
+ expectWireType(wireType, WireType.LengthDelimited)
let
size = readVarint(stream)
- data = readStr(stream, int(size))
+ data = safeReadStr(stream, int(size))
pbs = newProtobufStream(newStringStream(data))
addphones(result, readPhoneNumber(pbs))
else: skipField(stream, wireType)
@@ -181,10 +181,10 @@ proc newAddressBook*(): AddressBook =
proc clearpeople*(message: AddressBook) =
message.people = @[]
- excl(message.hasField, 1)
+ excl(message.hasField, [1])
proc haspeople*(message: AddressBook): bool =
- result = contains(message.hasField, 1)
+ result = contains(message.hasField, 1) or (len(message.people) > 0)
proc setpeople*(message: AddressBook, value: seq[Person]) =
message.people = value
@@ -202,18 +202,12 @@ proc `people=`*(message: AddressBook, value: seq[Person]) {.inline.} =
proc sizeOfAddressBook*(message: AddressBook): uint64 =
for value in message.people:
- let
- sizeOfValue = sizeOfPerson(value)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(1, WireType.LengthDelimited)))
- result = result + sizeOfValue + sizeOfTag
-
- result = result + sizeOfUInt64(sizeOfValue)
+ result = result + sizeOfTag(1, WireType.LengthDelimited)
+ result = result + sizeOfLengthDelimited(sizeOfPerson(value))
proc writeAddressBook*(stream: ProtobufStream, message: AddressBook) =
for value in message.people:
- writeTag(stream, 1, WireType.LengthDelimited)
- writeVarint(stream, sizeOfPerson(value))
- writePerson(stream, value)
+ writeMessage(stream, value, 1)
proc readAddressBook*(stream: ProtobufStream): AddressBook =
result = newAddressBook()
@@ -222,10 +216,13 @@ proc readAddressBook*(stream: ProtobufStream): AddressBook =
tag = readTag(stream)
wireType = getTagWireType(tag)
case getTagFieldNumber(tag)
+ of 0:
+ raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
+ expectWireType(wireType, WireType.LengthDelimited)
let
size = readVarint(stream)
- data = readStr(stream, int(size))
+ data = safeReadStr(stream, int(size))
pbs = newProtobufStream(newStringStream(data))
addpeople(result, readPerson(pbs))
else: skipField(stream, wireType)
diff --git a/examples/addressbook/phonenumber_pb.nim b/examples/addressbook/phonenumber_pb.nim
index e23cf36..6d331d3 100644
--- a/examples/addressbook/phonenumber_pb.nim
+++ b/examples/addressbook/phonenumber_pb.nim
@@ -2,8 +2,7 @@
import intsets
-import protobuf/stream
-import protobuf/types
+import protobuf/protobuf
type
PhoneType* {.pure.} = enum
@@ -22,9 +21,17 @@ proc readPhoneType*(stream: ProtobufStream): PhoneType =
proc writePhoneType*(stream: ProtobufStream, value: PhoneType) =
writeUInt32(stream, uint32(value))
+proc writePhoneType*(stream: ProtobufStream, value: PhoneType, fieldNumber: int) =
+ writeUInt32(stream, uint32(value), fieldNumber)
+
proc sizeOfPhoneType*(value: PhoneType): uint64 =
sizeOfUInt32(uint32(value))
+proc newPhoneNumber*(): PhoneNumber
+proc writePhoneNumber*(stream: ProtobufStream, message: PhoneNumber)
+proc readPhoneNumber*(stream: ProtobufStream): PhoneNumber
+proc sizeOfPhoneNumber*(message: PhoneNumber): uint64
+
proc newPhoneNumber*(): PhoneNumber =
new(result)
result.hasField = initIntSet()
@@ -33,7 +40,7 @@ proc newPhoneNumber*(): PhoneNumber =
proc clearnumber*(message: PhoneNumber) =
message.number = ""
- excl(message.hasField, 1)
+ excl(message.hasField, [1])
proc hasnumber*(message: PhoneNumber): bool =
result = contains(message.hasField, 1)
@@ -50,7 +57,7 @@ proc `number=`*(message: PhoneNumber, value: string) {.inline.} =
proc clearftype*(message: PhoneNumber) =
message.ftype = PhoneType(0)
- excl(message.hasField, 2)
+ excl(message.hasField, [2])
proc hasftype*(message: PhoneNumber): bool =
result = contains(message.hasField, 2)
@@ -67,23 +74,17 @@ proc `ftype=`*(message: PhoneNumber, value: PhoneType) {.inline.} =
proc sizeOfPhoneNumber*(message: PhoneNumber): uint64 =
if hasnumber(message):
- let
- sizeOfField = sizeOfString(message.number)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(1, WireType.LengthDelimited)))
- result = result + sizeOfField + sizeOfTag
+ result = result + sizeOfTag(1, WireType.LengthDelimited)
+ result = result + sizeOfString(message.number)
if hasftype(message):
- let
- sizeOfField = sizeOfPhoneType(message.ftype)
- sizeOfTag = sizeOfUInt32(uint32(makeTag(2, WireType.Varint)))
- result = result + sizeOfField + sizeOfTag
+ result = result + sizeOfTag(2, WireType.Varint)
+ result = result + sizeOfPhoneType(message.ftype)
proc writePhoneNumber*(stream: ProtobufStream, message: PhoneNumber) =
if hasnumber(message):
- writeTag(stream, 1, WireType.LengthDelimited)
- writeString(stream, message.number)
+ writeString(stream, message.number, 1)
if hasftype(message):
- writeTag(stream, 2, WireType.Varint)
- writePhoneType(stream, message.ftype)
+ writePhoneType(stream, message.ftype, 2)
proc readPhoneNumber*(stream: ProtobufStream): PhoneNumber =
result = newPhoneNumber()
@@ -92,9 +93,13 @@ proc readPhoneNumber*(stream: ProtobufStream): PhoneNumber =
tag = readTag(stream)
wireType = getTagWireType(tag)
case getTagFieldNumber(tag)
+ of 0:
+ raise newException(InvalidFieldNumberError, "Invalid field number: 0")
of 1:
+ expectWireType(wireType, WireType.LengthDelimited)
setnumber(result, readString(stream))
of 2:
+ expectWireType(wireType, WireType.Varint)
setftype(result, readPhoneType(stream))
else: skipField(stream, wireType)
diff --git a/examples/addressbook/reader.nim b/examples/addressbook/reader.nim
index ebbe773..aa0fd86 100644
--- a/examples/addressbook/reader.nim
+++ b/examples/addressbook/reader.nim
@@ -1,7 +1,7 @@
import streams
import strformat
-import protobuf/stream
+import protobuf/protobuf
import addressbook_pb
import phonenumber_pb
diff --git a/examples/addressbook/writer.nim b/examples/addressbook/writer.nim
index 0a3c866..44ff0a0 100644
--- a/examples/addressbook/writer.nim
+++ b/examples/addressbook/writer.nim
@@ -1,6 +1,6 @@
import streams
-import protobuf/stream
+import protobuf/protobuf
import addressbook_pb
import phonenumber_pb