ProtocolBuffers.FieldCode.GenerateFieldWriter C# (CSharp) Method

GenerateFieldWriter() public static method

Generates code for writing one field
public static GenerateFieldWriter ( Message m, Field f ) : string
m Message
f Field
return string
        public static string GenerateFieldWriter(Message m, Field f)
        {
            string code = "";
            if (f.Rule == FieldRule.Repeated) {
                if (f.OptionPacked == true) {

                    string binaryWriter = "";
                    switch (f.ProtoType) {
                    case ProtoTypes.Double:
                    case ProtoTypes.Float:
                    case ProtoTypes.Fixed32:
                    case ProtoTypes.Fixed64:
                    case ProtoTypes.Sfixed32:
                    case ProtoTypes.Sfixed64:
                        binaryWriter = "\nBinaryWriter bw" + f.ID + " = new BinaryWriter(ms" + f.ID + ");";
                        break;
                    }

                    code += "if(instance." + f.Name + " != null)\n";
                    code += "{\n";
                    code += "	ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(" + f.ID + ", Wire." + f.WireType + "));\n";
                    code += "	using(MemoryStream ms" + f.ID + " = new MemoryStream())\n";
                    code += "	{	" + binaryWriter + "\n";
                    code += "		foreach(" + f.PropertyItemType + " i" + f.ID + " in instance." + f.Name + ")\n";
                    code += "		{\n";
                    code += Code.Indent (3, GenerateFieldTypeWriter (f, "ms" + f.ID, "bw" + f.ID, "i" + f.ID)) + "\n";
                    code += "		}\n";
                    code += "		ProtocolParser.WriteBytes(stream, ms" + f.ID + ".ToArray());\n";
                    code += "	}\n";
                    code += "}\n";
                    return code;
                } else {
                    code += "if(instance." + f.Name + " != null)\n";
                    code += "{\n";
                    code += "	foreach(" + f.PropertyItemType + " i" + f.ID + " in instance." + f.Name + ")\n";
                    code += "	{\n";
                    code += "		ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(" + f.ID + ", Wire." + f.WireType + "));\n";
                    code += Code.Indent (2, GenerateFieldTypeWriter (f, "stream", "bw", "i" + f.ID)) + "\n";
                    code += "	}\n";
                    code += "}\n";
                    return code;
                }
            } else if (f.Rule == FieldRule.Optional) {
                switch (f.ProtoType) {
                case ProtoTypes.String:
                case ProtoTypes.Message:
                case ProtoTypes.Bytes:
                    code += "if(instance." + f.Name + " != null)\n";
                    code += "{\n";
                    code += "	ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(" + f.ID + ", Wire." + f.WireType + "));\n";
                    code += Code.Indent (GenerateFieldTypeWriter (f, "stream", "bw", "instance." + f.Name));
                    code += "}\n";
                    return code;
                case ProtoTypes.Enum:
                    code += "if(instance." + f.Name + " != " + f.PropertyItemType + "." + f.OptionDefault + ")\n";
                    code += "{\n";
                    code += "	ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(" + f.ID + ", Wire." + f.WireType + "));\n";
                    code += Code.Indent (GenerateFieldTypeWriter (f, "stream", "bw", "instance." + f.Name));
                    code += "}\n";
                    return code;
                default:
                    code += "ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(" + f.ID + ", Wire." + f.WireType + "));\n";
                    code += GenerateFieldTypeWriter (f, "stream", "bw", "instance." + f.Name);
                    return code;
                }
            } else if (f.Rule == FieldRule.Required) {
                switch (f.ProtoType) {
                case ProtoTypes.String:
                case ProtoTypes.Message:
                case ProtoTypes.Bytes:
                    code += "if(instance." + f.Name + " == null)\n";
                    code += "	throw new ArgumentNullException(\"" + f.Name + "\", \"Required by proto specification.\");\n";
                    break;
                }
                code += "ProtocolParser.WriteKey(stream, new ProtocolBuffers.Key(" + f.ID + ", Wire." + f.WireType + "));\n";
                code += GenerateFieldTypeWriter (f, "stream", "bw", "instance." + f.Name);
                return code;
            }
            throw new NotImplementedException ("Unknown rule: " + f.Rule);
        }