using FlutterCodeGenerator.Helper; using FlutterCodeGenerator.Model; using FlutterCodeGenerator.ModelTypes; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; namespace FlutterCodeGenerator.Map { internal class MethodMap { public List ParameterModelTypes; public ModelType ReturnParameterModelType { get; set; } public string MethodName { get; private set; } public MethodMap(MethodInfo method) { MethodName = method.Name; GenerateDataCache.Instance.CurrentMethod = MethodName; ParameterModelTypes = new List(); Type returnParameterType; if (method.ReturnType.Name != "Task`1") { returnParameterType = method.ReturnType; } else { returnParameterType = method.ReturnType.GetGenericArguments()[0]; } ReturnParameterModelType = ModelTypeGenerator.Create(returnParameterType, "", true); var parameters = method.GetParameters(); foreach (var parameter in parameters) { var parameterType = parameter.ParameterType; var parameterModelType = ModelTypeGenerator.Create(parameterType, parameter.Name, true); ParameterModelTypes.Add(parameterModelType); } } public string GetMethodDartString() { var dartString = new StringBuilder(); var parameterNames = string.Join(",", ParameterModelTypes.Select(r => r.GetFlutterTypeName() + " " + r.Name_Lower)); var argumentNames = string.Join(",", ParameterModelTypes.Select(r => r.Name_Lower)); if (ParameterModelTypes.Count > 1) { argumentNames = "[" + argumentNames + "]"; } dartString.AppendLine($"\tFuture<{ReturnParameterModelType.GetFlutterTypeName()}> {LetterConverterHelper.FirstCharToLower(MethodName)}({parameterNames}) async {{"); if (ReturnParameterModelType is VoidModelType) { dartString.AppendLine($"\t\tawait call(\"{MethodName}\", {argumentNames});"); } else { dartString.AppendLine($"\t\tvar rpcRst = await call(\"{MethodName}\", {argumentNames});"); if (ReturnParameterModelType is SimpleModelType && !(ReturnParameterModelType is ListModelType) && !(ReturnParameterModelType is DictionaryModelType) && !(ReturnParameterModelType is ArrayModelType)) { dartString.AppendLine("\t\treturn rpcRst;"); } else if (ReturnParameterModelType is UserDefinedModelType || ReturnParameterModelType is UserDefinedGenericModelType || ReturnParameterModelType is UserDefinedDerivedModelType) { dartString.AppendLine($"\t\tvar result = {ReturnParameterModelType.GetFlutterTypeName()}.fromJson(rpcRst as Map);"); dartString.AppendLine("\t\treturn result;"); } else if (ReturnParameterModelType is ListModelType genericModelType) { if (genericModelType.GenericArgumentModelType is SimpleModelType simpleModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();"); dartString.AppendLine("\t\treturn result;"); } else if (genericModelType.GenericArgumentModelType is EnumModelType enumModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (genericModelType.GenericArgumentModelType is UserDefinedModelType userDefinedComplexModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModelType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (genericModelType.GenericArgumentModelType is UserDefinedDerivedModelType userDefinedDerivedModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } } else if (ReturnParameterModelType is ArrayModelType arrayModelType) { if (arrayModelType.Child is SimpleModelType simpleModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();"); dartString.AppendLine("\t\treturn result;"); } else if (arrayModelType.Child is EnumModelType enumModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (arrayModelType.Child is UserDefinedModelType userDefinedComplexModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModelType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } else if (arrayModelType.Child is UserDefinedDerivedModelType userDefinedDerivedModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map)).toList();"); dartString.AppendLine("\t\treturn result;"); } } else if (ReturnParameterModelType is DictionaryModelType dictionaryModelType) { dartString.AppendLine($"\t\tvar result = (rpcRst as Map).cast<{dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName()},{dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName()}>();"); dartString.AppendLine("\t\treturn result;"); } else if (ReturnParameterModelType is EnumModelType enumModelType) { dartString.AppendLine($"\t\tvar result = {enumModelType.GetFlutterTypeName()}.values.firstWhere((e) => e.index == rpcRst);"); dartString.AppendLine("\t\treturn result;"); } } dartString.AppendLine("\t}"); return dartString.ToString(); } } }