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 }