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