1 module mmap;
2 
3 import std.mmfile;
4 import std.stdio;
5 
6 import capnproto.FileDescriptor;
7 import capnproto.MemoryMapped;
8 import capnproto.MessageBuilder;
9 import capnproto.MessageReader;
10 import capnproto.Serialize;
11 import capnproto.StructList;
12 import capnproto.Void;
13 
14 import addressbook;
15 
16 void writeAddressBook()
17 {
18 	MessageBuilder message = new MessageBuilder();
19 	
20 	auto addressbook = message.initRoot!AddressBook;
21 	
22 	auto people = addressbook.initPeople(2);
23 	
24 	auto alice = people[0];
25 	alice.id = 123;
26 	alice.name = "Alice";
27 	alice.email = "alice@example.com";
28 	
29 	auto alicePhones = alice.initPhones(1);
30 	alicePhones[0].number = "555-1212";
31 	alicePhones[0].type = Person.PhoneNumber.Type.mobile;
32 	alice.employment.school = "MIT";
33 	
34 	auto bob = people[1];
35 	bob.id = 456;
36 	bob.name = "Bob";
37 	bob.email = "bob@example.com";
38 	auto bobPhones = bob.initPhones(2);
39 	bobPhones[0].number = "555-4567";
40 	bobPhones[0].type = Person.PhoneNumber.Type.home;
41 	bobPhones[1].number = "555-7654";
42 	bobPhones[1].type = Person.PhoneNumber.Type.work;
43 	bob.employment.setUnemployed();
44 	
45 	auto fd = new FileDescriptor(File("addressBookForMmap.bin", "w"));
46 	Serialize.write(fd, message);
47 	fd.close();
48 }
49 
50 void printAddressBook()
51 {
52 	auto message = Serialize.read(new MemoryMapped(new MmFile("addressBookForMmap.bin")));
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 main(string[] args)
102 {
103 	writeAddressBook();
104 	printAddressBook();
105 }