Files
zeekay fe49a3b74f rebrand Cap'n Proto D port to ZAP
Rename the capnproto-dlang fork to zap-dlang: source/capnproto/ -> source/zap/
(module/import paths capnproto.* -> zap.*), compiler plugin capnpc-dlang ->
zapc-dlang, schemas .capnp -> .zap, Makefile pkg-config/-lcapnp -> zap/-lzap,
README/CONTRIBUTORS rebranded with canonical zap-proto.io/zap-proto.dev/
github.com/zap-proto/d links. Pure mechanical rename: no logic changes.
Upstream Sandstorm MIT headers preserved.
2026-06-19 23:47:11 -07:00

117 lines
2.4 KiB
D

module test;
import std.stdio;
import zap.FileDescriptor;
import zap.MessageBuilder;
import zap.MessageReader;
import zap.SerializePacked;
import zap.StructList;
import zap.Void;
import addressbook;
void writeAddressBook()
{
MessageBuilder message = new MessageBuilder();
auto addressbook = message.initRoot!AddressBook;
auto people = addressbook.initPeople(2);
auto alice = people[0];
alice.id = 123;
/* you can use dlang style property access ...
alice.name = "Alice";
... or get/set methods like C++ zap interface ...
*/
alice.setName("Alice");
alice.email = "[email protected]";
auto alicePhones = alice.initPhones(1);
alicePhones[0].number = "555-1212";
alicePhones[0].type = Person.PhoneNumber.Type.mobile;
alice.employment.school = "MIT";
auto bob = people[1];
bob.id = 456;
bob.name = "Bob";
bob.email = "[email protected]";
auto bobPhones = bob.initPhones(2);
bobPhones[0].number = "555-4567";
bobPhones[0].type = Person.PhoneNumber.Type.home;
bobPhones[1].number = "555-7654";
bobPhones[1].type = Person.PhoneNumber.Type.work;
bob.employment.setUnemployed();
SerializePacked.writeToUnbuffered(new FileDescriptor(stdout), message);
}
void printAddressBook()
{
auto message = SerializePacked.readFromUnbuffered(new FileDescriptor(stdin));
auto addressbook = message.getRoot!AddressBook;
foreach(person; addressbook.people)
{
writefln("%s: %s", person.name, person.email);
foreach(phone; person.phones)
{
string typeName = "UNKNOWN";
switch(phone.type) with(Person.PhoneNumber.Type)
{
case mobile:
typeName = "mobile";
break;
case home:
typeName = "home";
break;
case work:
typeName = "work";
break;
default:
break;
}
writefln(" %s phone: %s", typeName, phone.number);
}
auto employment = person.employment;
switch(employment.which()) with(Person.Employment.Which)
{
case unemployed:
writefln(" unemployed");
break;
case employer:
writefln(" employer: %s", employment.employer);
break;
case school:
writefln(" student at: %s", employment.school);
break;
case selfEmployed:
writefln(" self-employed");
break;
default:
break;
}
}
}
void usage()
{
writeln("usage: addressbook [write | read]");
}
void main(string[] args)
{
if(args.length < 2)
usage();
else if(args[1] == "write")
writeAddressBook();
else if(args[1] == "read")
printAddressBook();
else
usage();
}