using System.Text; namespace etoy { class TSMetadataTableGenerater : IGenerater { private const string MetadataTypeArea = "<#MetadataTypeArea>"; private const string CLASS_FILE_NAME = "xlsConfig.ts"; public void Generate(Context context) { var tables = context.Blackboard.MetadataTables; var sbMetadataTypes = new StringBuilder(); foreach (var table in tables) GenSingle(table, context, sbMetadataTypes); // metadata也写在XlsConfig var xlsConfigPath = Path.Combine(context.Option.ServerCodeOutput, CLASS_FILE_NAME); var xlsConfigText = File.ReadAllText(xlsConfigPath); xlsConfigText = xlsConfigText.Replace(MetadataTypeArea, sbMetadataTypes.ToString()); File.WriteAllText(xlsConfigPath, xlsConfigText, Encoding.UTF8); } private void GenSingle(MetadataTable table, Context context, StringBuilder sbMetadataTypes) { foreach (var row in table.Rows) { var key = row.Struct.StructType; switch (key) { case MetadataStructType.Struct: GenStruct(row, sbMetadataTypes); break; case MetadataStructType.Enum: GenEnum(row, sbMetadataTypes); break; } } } private void GenStruct(MetadataRow row, StringBuilder sbMetadataTypes) { sbMetadataTypes.AppendLine($"export interface {row.Struct.Name} {{"); // 属性定义 foreach (var field in row.Struct.Fields) { var fieldType = field.FieldType.ToTSFieldType();// isContainsMetadataType ? $"{field.FieldType}" : field.FieldType; var fieldName = field.Name; if (field.StructRepeated) {// 数组 sbMetadataTypes.AppendLine($" {fieldName}: {fieldType}[];"); } else { // 字段 sbMetadataTypes.AppendLine($" {fieldName}: {fieldType};"); } } sbMetadataTypes.Append("}\n"); } private void GenEnum(MetadataRow row, StringBuilder sbMetadataTypes) { sbMetadataTypes.Append($"export enum {row.Struct.Name} {{ "); foreach (var field in row.Struct.Fields) { if (string.IsNullOrEmpty(field.EnumValue)) sbMetadataTypes.Append($"{field.Name}, "); else sbMetadataTypes.Append($"{field.Name} = {field.EnumValue}, "); } sbMetadataTypes.Append("}\n"); } } }