|
@@ -0,0 +1,426 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Text;
|
|
|
+
|
|
|
+namespace FlutterCodeGenerator
|
|
|
+{
|
|
|
+ public interface IGenericType
|
|
|
+ {
|
|
|
+ string GetGenericFlutterName();
|
|
|
+ }
|
|
|
+
|
|
|
+ public class ModelType
|
|
|
+ {
|
|
|
+ public Type ParameterType { get; set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ ///Name(First Character Lower Case)
|
|
|
+ /// </summary>
|
|
|
+ public string Name_Lower { get; set; }
|
|
|
+
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ ///Name(First Character Upper Case)
|
|
|
+ /// </summary>
|
|
|
+ public string Name_Upper { get; set; }
|
|
|
+
|
|
|
+ public ModelType(Type type, string name)
|
|
|
+ {
|
|
|
+ ParameterType = type;
|
|
|
+ Name_Lower = LetterConverterHelper.FirstCharToLower(name);
|
|
|
+ Name_Upper = LetterConverterHelper.FirstCharToUpper(name);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return ParameterType.Name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class SimpleModelType : ModelType
|
|
|
+ {
|
|
|
+ public SimpleModelType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class StringModeType : SimpleModelType
|
|
|
+ {
|
|
|
+ public StringModeType(string name) : base(typeof(string), name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class DateTimeModeType : SimpleModelType
|
|
|
+ {
|
|
|
+ public DateTimeModeType(string name) : base(typeof(DateTime), name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class IntModeType : SimpleModelType
|
|
|
+ {
|
|
|
+ public IntModeType(string name) : base(typeof(int), name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return "int";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class DoubleModeType : SimpleModelType
|
|
|
+ {
|
|
|
+ public DoubleModeType(string name) : base(typeof(int), name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return "double";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class BoolModeType : SimpleModelType
|
|
|
+ {
|
|
|
+ public BoolModeType(string name) : base(typeof(bool), name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return "bool";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class ComplexModelType : ModelType
|
|
|
+ {
|
|
|
+ public List<ModelType> Children { get; set; }
|
|
|
+
|
|
|
+ public ComplexModelType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ Children = new List<ModelType>();
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return ParameterType.Name;
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual string GetDartString()
|
|
|
+ {
|
|
|
+ var dartString = new StringBuilder();
|
|
|
+ return dartString.ToString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class EnumModeType : ComplexModelType
|
|
|
+ {
|
|
|
+ public EnumModeType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetDartString()
|
|
|
+ {
|
|
|
+ var dartString = new StringBuilder();
|
|
|
+ dartString.AppendLine($"enum {GetFlutterTypeName()} {{");
|
|
|
+ foreach (var enumvalue in Enum.GetValues(ParameterType))
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t{enumvalue},");
|
|
|
+ }
|
|
|
+ dartString.AppendLine("}");
|
|
|
+ return dartString.ToString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class ArrayModelType : SimpleModelType
|
|
|
+ {
|
|
|
+ public ArrayModelType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ var arraytypeName = ParameterType.FullName.Replace("[]", string.Empty);
|
|
|
+ var arraytype = ParameterType.Assembly.GetType(arraytypeName);
|
|
|
+ ModelTypeGenerator.Create(arraytype, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return $"List<{ParameterType.Name[0..^2]}>";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class ListModelType : SimpleModelType, IGenericType
|
|
|
+ {
|
|
|
+ public ModelType GenericArgumentModelType;
|
|
|
+
|
|
|
+ public ListModelType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
|
|
|
+ GenericArgumentModelType = modelType;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ var flutterTypeName = ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
|
|
|
+ return flutterTypeName;
|
|
|
+ }
|
|
|
+
|
|
|
+ public string GetGenericFlutterName()
|
|
|
+ {
|
|
|
+ var genericFlutterName = ParameterType.Name[0..^2] + "<T>";
|
|
|
+ return genericFlutterName;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class DictionaryModelType : SimpleModelType, IGenericType
|
|
|
+ {
|
|
|
+ public List<ModelType> GenericArgumentModelTypeList;
|
|
|
+ public DictionaryModelType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ GenericArgumentModelTypeList = new List<ModelType>();
|
|
|
+ foreach (var argumentType in type.GetGenericArguments())
|
|
|
+ {
|
|
|
+ var modelType = ModelTypeGenerator.Create(argumentType, "");
|
|
|
+ GenericArgumentModelTypeList.Add(modelType);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ var flutterTypeName = ParameterType.Name[0..^2] + "<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">";
|
|
|
+ flutterTypeName = flutterTypeName.Replace("Dictionary", "Map");
|
|
|
+ return flutterTypeName;
|
|
|
+ }
|
|
|
+
|
|
|
+ public string GetGenericFlutterName()
|
|
|
+ {
|
|
|
+ var genericFlutterName = ParameterType.Name[0..^2] + "<TKey,TValue>";
|
|
|
+ genericFlutterName = genericFlutterName.Replace("Dictionary", "Map");
|
|
|
+ return genericFlutterName;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public class UserDefinedGenericComplexModelType : ComplexModelType, IGenericType
|
|
|
+ {
|
|
|
+ public ModelType GenericArgumentModelType;
|
|
|
+
|
|
|
+ public UserDefinedGenericComplexModelType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ var properties = type.GetProperties();
|
|
|
+ foreach (var property in properties)
|
|
|
+ {
|
|
|
+ var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
|
|
|
+ Children.Add(child);
|
|
|
+ }
|
|
|
+ var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
|
|
|
+ GenericArgumentModelType = modelType;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ var flutterTypeName = ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
|
|
|
+ return flutterTypeName;
|
|
|
+ }
|
|
|
+
|
|
|
+ public string GetGenericFlutterName()
|
|
|
+ {
|
|
|
+ var flutterTypeName = ParameterType.Name[0..^2] + "<T>";
|
|
|
+ return flutterTypeName;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetDartString()
|
|
|
+ {
|
|
|
+ var dartString = new StringBuilder();
|
|
|
+ dartString.AppendLine($"class {GetGenericFlutterName()} {{");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ var genericType = child as IGenericType;
|
|
|
+ if (genericType != null)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\tfinal {genericType.GetGenericFlutterName()} {child.Name_Lower};");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\tfinal {child.GetFlutterTypeName()} {child.Name_Lower};");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine();
|
|
|
+ dartString.AppendLine($"\t{ParameterType.Name[0..^2]}({{");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\trequired this.{child.Name_Lower},");
|
|
|
+ }
|
|
|
+ dartString.AppendLine("\t});");
|
|
|
+ dartString.AppendLine();
|
|
|
+ dartString.AppendLine($"\tfactory {ParameterType.Name[0..^2]}.fromJson(Map<String, dynamic> map) {{");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (child is ArrayModelType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];");
|
|
|
+ }
|
|
|
+ var genericType = child as IGenericType;
|
|
|
+ if (genericType != null)
|
|
|
+ {
|
|
|
+ if (child.ParameterType.GetGenericArguments().Length == 1)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t{genericType.GetGenericFlutterName()} {child.Name_Lower}List = [];");
|
|
|
+ dartString.AppendLine($"\t\tif (map['{child.Name_Upper}'] != null) {{");
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}List.addAll((map['{child.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
|
|
|
+ dartString.AppendLine("\t\t}");
|
|
|
+ }
|
|
|
+ else if (child.ParameterType.GetGenericArguments().Length == 2)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t{genericType.GetGenericFlutterName()} {child.Name_Lower}Map = {{}};");
|
|
|
+ dartString.AppendLine($"\t\tif (map['{child.Name_Upper}'] != null) {{");
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}Map.addAll(map['{child.Name_Upper}'].map((e) => FJsonConvert.fromJson<T>(e)!));");
|
|
|
+ dartString.AppendLine("\t\t}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine($"\t\treturn {ParameterType.Name[0..^2]}( ");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (child is EnumModeType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
|
|
|
+ }
|
|
|
+ else if (child is ArrayModelType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => {child.Name_Lower.Replace("[]", string.Empty)}.fromJson(e)).toList(): const [],");
|
|
|
+ }
|
|
|
+ else if (child is IGenericType)
|
|
|
+ {
|
|
|
+ var genericType = child as IGenericType;
|
|
|
+ if (child.ParameterType.GetGenericArguments().Length == 1)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}List,");
|
|
|
+ }
|
|
|
+ else if (child.ParameterType.GetGenericArguments().Length == 2)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Map,");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine("\t\t);");
|
|
|
+ dartString.AppendLine("\t}");
|
|
|
+ dartString.AppendLine();
|
|
|
+ dartString.AppendLine("\tMap<String, dynamic> toJson() {");
|
|
|
+ dartString.AppendLine("\t\tfinal map = Map<String, dynamic>();");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (child is EnumModeType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
|
|
|
+ }
|
|
|
+ else if (child is ArrayModelType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.map((e) => e.toJson()).toList();");
|
|
|
+ }
|
|
|
+ else if (child is IGenericType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.map((dynamic e) => e.toJson()).toList();");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine("\t\treturn map;");
|
|
|
+ dartString.AppendLine("\t}");
|
|
|
+ dartString.AppendLine("}");
|
|
|
+ return dartString.ToString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class UserDefinedComplexModeType : ComplexModelType
|
|
|
+ {
|
|
|
+ public UserDefinedComplexModeType(Type type, string name) : base(type, name)
|
|
|
+ {
|
|
|
+ var properties = type.GetProperties();
|
|
|
+ foreach (var property in properties)
|
|
|
+ {
|
|
|
+ var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
|
|
|
+ Children.Add(child);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetFlutterTypeName()
|
|
|
+ {
|
|
|
+ return $"{ParameterType.Name}";
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string GetDartString()
|
|
|
+ {
|
|
|
+ var dartString = new StringBuilder();
|
|
|
+ var flutterTypeName = GetFlutterTypeName();
|
|
|
+ dartString.AppendLine($"class {flutterTypeName} {{");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\tfinal {child.GetFlutterTypeName()} {child.Name_Lower};");
|
|
|
+ }
|
|
|
+ dartString.AppendLine();
|
|
|
+ dartString.AppendLine($"\t{flutterTypeName}({{");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\trequired this.{child.Name_Lower},");
|
|
|
+ }
|
|
|
+ dartString.AppendLine("\t});");
|
|
|
+ dartString.AppendLine();
|
|
|
+ dartString.AppendLine($"\tfactory {flutterTypeName}.fromJson(Map<String, dynamic> map) {{");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (child is ArrayModelType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine($"\t\treturn {flutterTypeName}( ");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (child is EnumModeType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
|
|
|
+ }
|
|
|
+ else if (child is ArrayModelType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => {child.ParameterType.Name.Replace("[]", string.Empty)}.fromJson(e)).toList(): const [],");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine("\t\t);");
|
|
|
+ dartString.AppendLine("\t}");
|
|
|
+ dartString.AppendLine();
|
|
|
+ dartString.AppendLine("\tMap<String, dynamic> toJson() {");
|
|
|
+ dartString.AppendLine("\t\tfinal map = Map<String, dynamic>();");
|
|
|
+ foreach (var child in Children)
|
|
|
+ {
|
|
|
+ if (child is EnumModeType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
|
|
|
+ }
|
|
|
+ else if (child is ArrayModelType)
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.map((e) => e.toJson()).toList();");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dartString.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dartString.AppendLine("\t\treturn map;");
|
|
|
+ dartString.AppendLine("\t}");
|
|
|
+ dartString.AppendLine("}");
|
|
|
+ return dartString.ToString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|