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()); }