﻿using System;
using System.IO;

namespace Google.ProtocolBuffers.Examples.AddressBook
{
    internal class SampleUsage
    {
        private static void Main()
        {
            byte[] bytes;
            //Create a builder to start building a message
            Person.Builder newContact = Person.CreateBuilder();
            //Set the primitive properties
            newContact.SetId(1)
                .SetName("Foo")
                .SetEmail("foo@bar");
            //Now add an item to a list (repeating) field
            newContact.AddPhone(
                //Create the child message inline
                Person.Types.PhoneNumber.CreateBuilder().SetNumber("555-1212").Build()
                );
            //Now build the final message:
            Person person = newContact.Build();
            //The builder is no longer valid (at least not now, scheduled for 2.4):
            newContact = null;
            using (MemoryStream stream = new MemoryStream())
            {
                //Save the person to a stream
                person.WriteTo(stream);
                bytes = stream.ToArray();
            }
            //Create another builder, merge the byte[], and build the message:
            Person copy = Person.CreateBuilder().MergeFrom(bytes).Build();

            //A more streamlined approach might look like this:
            bytes = AddressBook.CreateBuilder().AddPerson(copy).Build().ToByteArray();
            //And read the address book back again
            AddressBook restored = AddressBook.CreateBuilder().MergeFrom(bytes).Build();
            //The message performs a deep-comparison on equality:
            if (restored.PersonCount != 1 || !person.Equals(restored.PersonList[0]))
                throw new ApplicationException("There is a bad person in here!");
        }
    }
}