private string GenerateContractFile(XdrContractSerializationDescriptor сontractDescriptor, string contractName)
        {
            var builder = new StringBuilder();

            //write header
            builder.Append($@"/**
* {contractName} XDR data contract.
*/
class {contractName} {{");
            //write contract fields
            foreach (var prop in сontractDescriptor.Properties)
            {
                builder.Append(@$ "
    /**
    * @type {{{ResolveReflectedPropTypeName(prop)}}}
    */
    {ProcessFieldName(prop.PropertyName)}");
            }
            //write tail
            builder.Append($@"
}}

export default {contractName}");
            return(builder.ToString());
        }
        private string GenerateContractFile(XdrContractSerializationDescriptor contractDescriptor, string contractName)
        {
            var extendsContract = contractDescriptor.BaseContractType != null;
            var builder         = new StringBuilder();

            if (extendsContract)
            {
                builder.Append($"const {contractDescriptor.BaseContractType.Name} = require('./{GetContractFileName(contractDescriptor.BaseContractType)}')\n\n");
            }
            //write header
            builder.Append($@"/**
* {contractName} XDR data contract.
*/
module.exports = class {contractName}{(extendsContract ? $" extends {contractDescriptor.BaseContractType.Name}" : "")} {{");
            //write contract fields
            foreach (var prop in contractDescriptor.Properties.Where(p => !p.Inherited))
            {
                builder.Append(@$ "
    /**
    * @type {{{ResolveReflectedPropTypeName(prop)}}}
    */
    {ProcessFieldName(prop.PropertyName)}");
            }
            //write tail
            builder.Append($@"
}}");
            return(builder.ToString());
        }
 protected virtual string GetContractName(XdrContractSerializationDescriptor contractDescriptor)
 {
     return(contractDescriptor.XdrContractType.Name);
 }
 protected virtual string GetSerializerClassName(XdrContractSerializationDescriptor contractDescriptor)
 {
     return(GetContractName(contractDescriptor) + "Serializer");
 }
        private string GenerateSerializerFile(XdrContractSerializationDescriptor contractDescriptor, string contractName)
        {
            var builder = new StringBuilder();
            //write header
            var converClassName = contractName + "Serializer";

            builder.Append($@"/**
* Converter for {contractName} XDR data contract.
*/
class {converClassName} {{");
            //write union info
            if (contractDescriptor.UnionSwitch.Count > 0)
            {
                builder.Append(@"
    isUnion = true
    unionSwitch = {");
                foreach (var kv in contractDescriptor.UnionSwitch)
                {
                    builder.Append($@"
         '{kv.Key}': {kv.Value.ToString()},");
                }
                builder.Append(@"
    }");
            }
            if (contractDescriptor.AncestorUnionsCounts > 0)
            {
                builder.Append($@"
    ancestorUnionsCounts = {contractDescriptor.AncestorUnionsCounts}");
            }
            //write serialize method
            builder.Append($@"
    /**
    * @param {{{contractName}}} value - Value to serialize.
    * @param {{XdrWriter}} writer - XdrWriter stream instance.
    */
    serialize(value, writer) {{");
            //write union discriminators serialization if any
            foreach (var discriminator in contractDescriptor.UnionVector)
            {
                builder.Append($@"
        writer.write{GetMethodPrimitiveTypeName(typeof(int))}({discriminator})");
            }
            //write property serialization instructions
            foreach (var prop in contractDescriptor.Properties)
            {
                var propTypeDescriptor = GetTypeDescriptor(prop);
                var typeArg            = propTypeDescriptor.SubType != null ? $", '{propTypeDescriptor.SubType.PrimitiveTypeName}'" : null;
                builder.Append($@"
        writer.write{propTypeDescriptor.PrimitiveTypeName}(value.{ProcessFieldName(prop.PropertyName)}{typeArg})");
            }
            builder.Append(@"
    }
");
            //write deserialize method
            builder.Append($@"
   /**
   * @param {{{contractName}}} value - Instance of object to deserialize into.
   * @param {{XdrReader}} reader - XdrReader stream instance.
   */
   deserialize(value, reader) {{");
            //write property deserialization instructions
            foreach (var prop in contractDescriptor.Properties)
            {
                var propTypeDescriptor = GetTypeDescriptor(prop);
                var typeArg            = propTypeDescriptor.SubType != null ? $"'{propTypeDescriptor.SubType.PrimitiveTypeName}'" : null;
                builder.Append($@"
        value.{ProcessFieldName(prop.PropertyName)} = reader.read{propTypeDescriptor.PrimitiveTypeName}({typeArg})");
            }
            builder.Append(@"
    }
");
            //write converter tail
            builder.Append($@"}}

export default {converClassName}");
            return(builder.ToString());
        }
        private string GenerateSerializerFile(XdrContractSerializationDescriptor contractDescriptor)
        {
            var builder = new StringBuilder();

            //write header
            builder.Append($@"using System;
using Centaurus.Xdr;
using System.Collections.Generic;

namespace {ContractsNamespace}
{{
    public class {GetSerializerClassName(contractDescriptor)}: IXdrRuntimeContractSerializer<{GetContractName(contractDescriptor)}>
    {{");
            //write union info
            if (contractDescriptor.UnionSwitch.Count > 0)
            {
                builder.Append(@"
        public readonly bool IsUnion = true;
");
            }
            if (contractDescriptor.AncestorUnionsCounts > 0)
            {
                builder.Append($@"
        public readonly int AncestorUnionsCounts = {contractDescriptor.AncestorUnionsCounts};
");
            }
            //write serialize method
            builder.Append($@"
        public static void Serialize({contractDescriptor.XdrContractType.Name} value, XdrWriter writer) {{");
            //write union discriminators serialization if any
            foreach (var discriminator in contractDescriptor.UnionVector)
            {
                builder.Append($@"
            writer.Write{GetMethodPrimitiveTypeName(typeof(int))}({discriminator});");
            }
            //write property serialization instructions
            foreach (var prop in contractDescriptor.Properties)
            {
                builder.Append($@"
            {GeneratePropertySerializeInstructions(prop)}");
            }
            builder.Append(@"
        }
");

            //write deserialize method
            builder.Append($@"
        public static void Deserialize({contractDescriptor.XdrContractType.Name} value, XdrReader reader) {{");
            //write property deserialization instructions
            foreach (var prop in contractDescriptor.Properties)
            {
                builder.Append($@"
            {GeneratePropertyDeserializeInstructions(prop)};");
            }
            builder.Append(@"
        }
");
            if (contractDescriptor.UnionSwitch.Count > 0)
            {
                //write deserialize method
                builder.Append(@"
        public static Type ResolveActualUnionType(XdrReader reader) 
        {
            var typeId = reader.ReadInt32();
            switch (typeId)
            {");

                //write union discriminators serialization if any
                foreach (var kv in contractDescriptor.UnionSwitch)
                {
                    builder.Append($@"
                case {kv.Key}: return typeof({kv.Value.Name});");
                }
                builder.Append(@"
                default: throw new InvalidOperationException($""Failed to resolve type for union type id { typeId}."");
            }
        }
");
            }

            //write converter tail
            builder.Append(@"    }
}");
            return(builder.ToString());
        }