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!");
        }
    }
}