diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-17 21:56:05 +0100 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-17 21:56:05 +0100 |
| commit | 55f3a493871306ac220071574e2a5897851bef54 (patch) | |
| tree | 509140ba0ccb8c675520368f08d578d33c90f7a7 /examples | |
| parent | 55811e0f5467257a7f86fd474e4c6e234c2efa7b (diff) | |
| download | nimpb-55f3a493871306ac220071574e2a5897851bef54.tar.gz nimpb-55f3a493871306ac220071574e2a5897851bef54.zip | |
Update examples
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/addressbook/Makefile | 14 | ||||
| -rw-r--r-- | examples/addressbook/addressbook_pb.nim | 135 | ||||
| -rw-r--r-- | examples/addressbook/nim.cfg | 2 | ||||
| -rw-r--r-- | examples/addressbook/phonenumber_pb.nim | 59 | ||||
| -rw-r--r-- | examples/addressbook/reader.nim | 2 | ||||
| -rw-r--r-- | examples/addressbook/writer.nim | 2 | ||||
| -rw-r--r-- | examples/simple/Makefile | 8 | ||||
| -rw-r--r-- | examples/simple/simple_pb.nim | 59 |
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) |
