1 module test; 2 3 import std.stdio; 4 5 import capnproto.FileDescriptor; 6 import capnproto.MessageBuilder; 7 import capnproto.MessageReader; 8 import capnproto.SerializePacked; 9 import capnproto.StructList; 10 import capnproto.Void; 11 12 import addressbook; 13 14 void writeAddressBook() 15 { 16 MessageBuilder message = new MessageBuilder(); 17 18 auto addressbook = message.initRoot!AddressBook; 19 20 auto people = addressbook.initPeople(2); 21 22 auto alice = people[0]; 23 alice.id = 123; 24 /* you can use dlang style property access ... 25 alice.name = "Alice"; 26 ... or get/set methods like C++ capnproto interface ... 27 */ 28 alice.setName("Alice"); 29 alice.email = "alice@example.com"; 30 31 auto alicePhones = alice.initPhones(1); 32 alicePhones[0].number = "555-1212"; 33 alicePhones[0].type = Person.PhoneNumber.Type.mobile; 34 alice.employment.school = "MIT"; 35 36 auto bob = people[1]; 37 bob.id = 456; 38 bob.name = "Bob"; 39 bob.email = "bob@example.com"; 40 auto bobPhones = bob.initPhones(2); 41 bobPhones[0].number = "555-4567"; 42 bobPhones[0].type = Person.PhoneNumber.Type.home; 43 bobPhones[1].number = "555-7654"; 44 bobPhones[1].type = Person.PhoneNumber.Type.work; 45 bob.employment.setUnemployed(); 46 47 SerializePacked.writeToUnbuffered(new FileDescriptor(stdout), message); 48 } 49 50 void printAddressBook() 51 { 52 auto message = SerializePacked.readFromUnbuffered(new FileDescriptor(stdin)); 53 54 auto addressbook = message.getRoot!AddressBook; 55 56 foreach(person; addressbook.people) 57 { 58 writefln("%s: %s", person.name, person.email); 59 60 foreach(phone; person.phones) 61 { 62 string typeName = "UNKNOWN"; 63 switch(phone.type) with(Person.PhoneNumber.Type) 64 { 65 case mobile: 66 typeName = "mobile"; 67 break; 68 case home: 69 typeName = "home"; 70 break; 71 case work: 72 typeName = "work"; 73 break; 74 default: 75 break; 76 } 77 writefln(" %s phone: %s", typeName, phone.number); 78 } 79 80 auto employment = person.employment; 81 switch(employment.which()) with(Person.Employment.Which) 82 { 83 case unemployed: 84 writefln(" unemployed"); 85 break; 86 case employer: 87 writefln(" employer: %s", employment.employer); 88 break; 89 case school: 90 writefln(" student at: %s", employment.school); 91 break; 92 case selfEmployed: 93 writefln(" self-employed"); 94 break; 95 default: 96 break; 97 } 98 } 99 } 100 101 void usage() 102 { 103 writeln("usage: addressbook [write | read]"); 104 } 105 106 void main(string[] args) 107 { 108 if(args.length < 2) 109 usage(); 110 else if(args[1] == "write") 111 writeAddressBook(); 112 else if(args[1] == "read") 113 printAddressBook(); 114 else 115 usage(); 116 }