From 1defb9b10928fbd4b7b3c94dbab8432a83e9e9cd Mon Sep 17 00:00:00 2001 From: Oskari Timperi Date: Mon, 26 Mar 2018 22:02:12 +0300 Subject: Add addressbook example --- examples/addressbook/Makefile | 12 +++++ examples/addressbook/addressbook.proto | 24 +++++++++ examples/addressbook/addressbook_pb.nim | 96 +++++++++++++++++++++++++++++++++ examples/addressbook/nim.cfg | 1 + examples/addressbook/reader.nim | 19 +++++++ examples/addressbook/writer.nim | 37 +++++++++++++ 6 files changed, 189 insertions(+) create mode 100644 examples/addressbook/Makefile create mode 100644 examples/addressbook/addressbook.proto create mode 100644 examples/addressbook/addressbook_pb.nim create mode 100644 examples/addressbook/nim.cfg create mode 100644 examples/addressbook/reader.nim create mode 100644 examples/addressbook/writer.nim diff --git a/examples/addressbook/Makefile b/examples/addressbook/Makefile new file mode 100644 index 0000000..7fe8add --- /dev/null +++ b/examples/addressbook/Makefile @@ -0,0 +1,12 @@ +PLUGIN = ../../generator/protoc_gen_nim + +all: writer reader + +writer: writer.nim addressbook_pb.nim + nim c writer.nim + +reader: reader.nim addressbook_pb.nim + nim c reader.nim + +addressbook_pb.nim: addressbook.proto + protoc --plugin=protoc-gen-nim=$(PLUGIN) --nim_out=. -I. addressbook.proto diff --git a/examples/addressbook/addressbook.proto b/examples/addressbook/addressbook.proto new file mode 100644 index 0000000..5e04629 --- /dev/null +++ b/examples/addressbook/addressbook.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +message Person { + string name = 1; + int32 id = 2; + string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + string number = 1; + PhoneType type = 2; // [default = HOME]; default values not supported yet + } + + repeated PhoneNumber phones = 4; +} + +message AddressBook { + repeated Person people = 1; +} diff --git a/examples/addressbook/addressbook_pb.nim b/examples/addressbook/addressbook_pb.nim new file mode 100644 index 0000000..8a37fb4 --- /dev/null +++ b/examples/addressbook/addressbook_pb.nim @@ -0,0 +1,96 @@ +# Generated by protoc_gen_nim. Do not edit! + +import intsets + +import protobuf/gen +import protobuf/stream +import protobuf/types + +const + Person_PhoneTypeDesc = EnumDesc( + name: "Person_PhoneType", + values: @[ + EnumValueDesc(name: "MOBILE", number: 0), + EnumValueDesc(name: "HOME", number: 1), + EnumValueDesc(name: "WORK", number: 2), + ] + ) + Person_PhoneNumberDesc = MessageDesc( + name: "Person_PhoneNumber", + fields: @[ + FieldDesc( + name: "number", + number: 1, + ftype: FieldType.String, + label: FieldLabel.Optional, + typeName: "", + packed: false, + ), + FieldDesc( + name: "type", + number: 2, + ftype: FieldType.Enum, + label: FieldLabel.Optional, + typeName: "Person_PhoneType", + packed: false, + ), + ] + ) + PersonDesc = MessageDesc( + name: "Person", + fields: @[ + FieldDesc( + name: "name", + number: 1, + ftype: FieldType.String, + label: FieldLabel.Optional, + typeName: "", + packed: false, + ), + FieldDesc( + name: "id", + number: 2, + ftype: FieldType.Int32, + label: FieldLabel.Optional, + typeName: "", + packed: false, + ), + FieldDesc( + name: "email", + number: 3, + ftype: FieldType.String, + label: FieldLabel.Optional, + typeName: "", + packed: false, + ), + FieldDesc( + name: "phones", + number: 4, + ftype: FieldType.Message, + label: FieldLabel.Repeated, + typeName: "Person_PhoneNumber", + packed: false, + ), + ] + ) + AddressBookDesc = MessageDesc( + name: "AddressBook", + fields: @[ + FieldDesc( + name: "people", + number: 1, + ftype: FieldType.Message, + label: FieldLabel.Repeated, + typeName: "Person", + packed: false, + ), + ] + ) +generateEnumType(Person_PhoneTypeDesc) +generateEnumProcs(Person_PhoneTypeDesc) +generateMessageType(Person_PhoneNumberDesc) +generateMessageProcs(Person_PhoneNumberDesc) +generateMessageType(PersonDesc) +generateMessageProcs(PersonDesc) +generateMessageType(AddressBookDesc) +generateMessageProcs(AddressBookDesc) diff --git a/examples/addressbook/nim.cfg b/examples/addressbook/nim.cfg new file mode 100644 index 0000000..11736fc --- /dev/null +++ b/examples/addressbook/nim.cfg @@ -0,0 +1 @@ +--path:"../../src" diff --git a/examples/addressbook/reader.nim b/examples/addressbook/reader.nim new file mode 100644 index 0000000..4db86cc --- /dev/null +++ b/examples/addressbook/reader.nim @@ -0,0 +1,19 @@ +import streams +import strformat + +import protobuf/stream + +import addressbook_pb + +let pbsi = newProtobufStream(newFileStream("addressbook.dat")) + +let addressBook = readAddressBook(pbsi) + +for person in addressBook.people: + echo("---") + echo(&"Id: {person.id}") + echo(&"Name: {person.name}") + echo(&"Email: {person.email}") + echo("Phones:") + for phone in person.phones: + echo(&" {phone.type} {phone.number}") diff --git a/examples/addressbook/writer.nim b/examples/addressbook/writer.nim new file mode 100644 index 0000000..6d32005 --- /dev/null +++ b/examples/addressbook/writer.nim @@ -0,0 +1,37 @@ +import streams + +import protobuf/stream + +import addressbook_pb + +let addressBook = newAddressBook() + +let john = newPerson() +setName(john, "John Doe") +setId(john, 1) +setEmail(john, "john.doe@example.com") +addPeople(addressBook, john) + +let johnPhone1 = newPerson_PhoneNumber() +setNumber(johnPhone1, "1234") +setType(johnPhone1, MOBILE) +addPhones(john, johnPhone1) + +let johnPhone2 = newPerson_PhoneNumber() +setNumber(johnPhone2, "5566") +setType(johnPhone2, WORK) +addPhones(john, johnPhone2) + +let jane = newPerson() +setName(jane, "Jane Doe") +setId(jane, 2) +setEmail(jane, "jane.doe@example.com") +addPeople(addressBook, jane) + +let janePhone1 = newPerson_PhoneNumber() +setNumber(janePhone1, "1432") +setType(janePhone1, HOME) +addPhones(jane, janePhone1) + +let pbso = newProtobufStream(newFileStream("addressbook.dat", fmWrite)) +writeAddressBook(pbso, addressBook) -- cgit v1.2.3