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 }