diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-03 20:30:37 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-03 20:30:37 +0300 |
| commit | f27b133ad18d3884fb305083b08bceba18730fd7 (patch) | |
| tree | 1766321520f6bd84c46a06de6828ddbcacb26e9c | |
| parent | 54280463ac487e331daa43453058d02599f85102 (diff) | |
| download | nimpb-f27b133ad18d3884fb305083b08bceba18730fd7.tar.gz nimpb-f27b133ad18d3884fb305083b08bceba18730fd7.zip | |
Update examples
| -rw-r--r-- | examples/addressbook/addressbook_pb.nim | 91 | ||||
| -rw-r--r-- | examples/addressbook/phonenumber_pb.nim | 37 | ||||
| -rw-r--r-- | examples/addressbook/reader.nim | 2 | ||||
| -rw-r--r-- | examples/addressbook/writer.nim | 2 | ||||
| -rw-r--r-- | examples/simple/simple_pb.nim | 37 |
5 files changed, 88 insertions, 81 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 diff --git a/examples/simple/simple_pb.nim b/examples/simple/simple_pb.nim index 6de8b3f..6f20088 100644 --- a/examples/simple/simple_pb.nim +++ b/examples/simple/simple_pb.nim @@ -2,8 +2,7 @@ import intsets -import protobuf/stream -import protobuf/types +import protobuf/protobuf type Test1_MyEnum* {.pure.} = enum @@ -21,9 +20,17 @@ proc readTest1_MyEnum*(stream: ProtobufStream): Test1_MyEnum = proc writeTest1_MyEnum*(stream: ProtobufStream, value: Test1_MyEnum) = writeUInt32(stream, uint32(value)) +proc writeTest1_MyEnum*(stream: ProtobufStream, value: Test1_MyEnum, fieldNumber: int) = + writeUInt32(stream, uint32(value), fieldNumber) + proc sizeOfTest1_MyEnum*(value: Test1_MyEnum): uint64 = sizeOfUInt32(uint32(value)) +proc newTest1*(): Test1 +proc writeTest1*(stream: ProtobufStream, message: Test1) +proc readTest1*(stream: ProtobufStream): Test1 +proc sizeOfTest1*(message: Test1): uint64 + proc newTest1*(): Test1 = new(result) result.hasField = initIntSet() @@ -32,7 +39,7 @@ proc newTest1*(): Test1 = proc cleara*(message: Test1) = message.a = 0 - excl(message.hasField, 1) + excl(message.hasField, [1]) proc hasa*(message: Test1): bool = result = contains(message.hasField, 1) @@ -49,7 +56,7 @@ proc `a=`*(message: Test1, value: int32) {.inline.} = proc cleare*(message: Test1) = message.e = Test1_MyEnum(0) - excl(message.hasField, 2) + excl(message.hasField, [2]) proc hase*(message: Test1): bool = result = contains(message.hasField, 2) @@ -66,23 +73,17 @@ proc `e=`*(message: Test1, value: Test1_MyEnum) {.inline.} = proc sizeOfTest1*(message: Test1): uint64 = if hasa(message): - let - sizeOfField = sizeOfInt32(message.a) - sizeOfTag = sizeOfUInt32(uint32(makeTag(1, WireType.Varint))) - result = result + sizeOfField + sizeOfTag + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfInt32(message.a) if hase(message): - let - sizeOfField = sizeOfTest1_MyEnum(message.e) - sizeOfTag = sizeOfUInt32(uint32(makeTag(2, WireType.Varint))) - result = result + sizeOfField + sizeOfTag + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfTest1_MyEnum(message.e) proc writeTest1*(stream: ProtobufStream, message: Test1) = if hasa(message): - writeTag(stream, 1, WireType.Varint) - writeInt32(stream, message.a) + writeInt32(stream, message.a, 1) if hase(message): - writeTag(stream, 2, WireType.Varint) - writeTest1_MyEnum(stream, message.e) + writeTest1_MyEnum(stream, message.e, 2) proc readTest1*(stream: ProtobufStream): Test1 = result = newTest1() @@ -91,9 +92,13 @@ proc readTest1*(stream: ProtobufStream): Test1 = tag = readTag(stream) wireType = getTagWireType(tag) case getTagFieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") of 1: + expectWireType(wireType, WireType.Varint) seta(result, readInt32(stream)) of 2: + expectWireType(wireType, WireType.Varint) sete(result, readTest1_MyEnum(stream)) else: skipField(stream, wireType) |
