using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FlutterCodeGenerator { public class ModelType { public Type ParameterType { get; set; } /// ///Name(First Character Lower Case) /// public string Name_Lower { get; set; } /// ///Name(First Character Upper Case) /// public string Name_Upper { get; set; } public string DefaultValue { get; set; } /// /// Index(For Same Name) /// public int Index { get; set; } public ModelType(Type type, string name) { ParameterType = type; Name_Lower = LetterConverterHelper.FirstCharToLower(name); Name_Upper = LetterConverterHelper.FirstCharToUpper(name); DefaultValue = null; Index = 1; } public virtual string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return ParameterType.Name; } public virtual string GetDartString() { return string.Empty; } protected string QuestionMarkCheck(ModelType child) { if (child.DefaultValue != null) { return ""; } else { return "?"; } } } 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) { DefaultValue = "0"; } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "int"; } } public class IntNullableModeType : SimpleModelType { public IntNullableModeType(string name) : base(typeof(int?), name) { } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "int"; } } public class ByteModelType : SimpleModelType { public ByteModelType(string name) : base(typeof(byte), name) { DefaultValue = "0"; } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "int"; } } public class ByteNullableModelType : SimpleModelType { public ByteNullableModelType(string name) : base(typeof(byte?), name) { } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "int"; } } public class VoidModelType : SimpleModelType { public VoidModelType(string name) : base(typeof(void), name) { } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "void"; } } public class DoubleModeType : SimpleModelType { public DoubleModeType(string name) : base(typeof(double), name) { DefaultValue = "0"; } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "double"; } } public class DoubleNullableModeType : SimpleModelType { public DoubleNullableModeType(string name) : base(typeof(double?), name) { } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "double"; } } public class BoolModeType : SimpleModelType { public BoolModeType(string name) : base(typeof(bool), name) { DefaultValue = "false"; } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "bool"; } } public class BoolNullableModeType : SimpleModelType { public BoolNullableModeType(string name) : base(typeof(bool?), name) { } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { return "bool"; } } public class ExtraObjectModelType : SimpleModelType { public ExtraObjectModelType(Type type, string name) : base(type, name) { } } public class ComplexModelType : ModelType { public List Children { get; set; } public ComplexModelType(Type type, string name) : base(type, name) { Children = new List(); } protected virtual string ToJson(List Children) { var source = new StringBuilder(); source.AppendLine("\tMap toJson() {"); source.AppendLine("\t\tfinal map = Map();"); foreach (var child in Children) { if (child is EnumModeType) { source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;"); } else if (child.DefaultValue != null) { source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};"); } else if (child is DateTimeModeType) { source.AppendLine($"\t\tif({child.Name_Lower} != null)"); source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);"); } else { source.AppendLine($"\t\tif({child.Name_Lower} != null)"); source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};"); } } source.AppendLine("\t\treturn map;"); source.AppendLine("\t}"); return source.ToString(); } protected virtual string FromJson(List Children) { var source = new StringBuilder(); string flutterTypeName = null; if (this is UserDefinedGenericModelType) { flutterTypeName = GetFlutterTypeName(false, false, true); } else { flutterTypeName = GetFlutterTypeName(); } source.AppendLine($"\tfactory {flutterTypeName}.fromJson(Map map) {{"); foreach (var child in Children) { if (child is ArrayModelType) { source.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];"); } else if (child is ListModelType listModelType) { if (this is UserDefinedGenericModelType type) { if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\tList {listModelType.Name_Lower}List = [];"); source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{"); source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll("); source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson(e)!));"); source.AppendLine($"\t\t}}"); } } else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType) { if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\tList<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}> {listModelType.Name_Lower}List = [];"); source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{"); source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll("); source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}>(e)!));"); source.AppendLine($"\t\t}}"); } } } else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType) { if (this is UserDefinedGenericModelType type) { if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\tList {userDefinedGenericComplexModelType.Name_Lower}List = [];"); source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{"); source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll("); source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson(e)!));"); source.AppendLine($"\t\t}}"); } else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType) { if (baseType.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\tList<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}> {userDefinedGenericComplexModelType.Name_Lower}List = [];"); source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{"); source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll("); source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}>(e)!));"); source.AppendLine($"\t\t}}"); } } } } } source.AppendLine($"\t\treturn {flutterTypeName}( "); foreach (var child in Children) { if (child is EnumModeType) { source.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),"); } else if (child is EnumNullableModelType) { source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']) : null,"); } else if (child is ArrayModelType) { var arrayTypeName = child.ParameterType.FullName.Replace("[]", string.Empty); var arrayType = child.ParameterType.Assembly.GetType(arrayTypeName); var modelType = ModelTypeGenerator.Create(arrayType, ""); if (modelType is ByteModelType) { source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as int).toList(): null,"); } else if (modelType is SimpleModelType && (modelType is ExtraObjectModelType)) { source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as {child.ParameterType.Name.Replace("[]", string.Empty)}).toList(): null,"); } else { source.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(): null,"); } } else if (child is DateTimeModeType) { source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? DateTime.parse(map['{child.Name_Upper}']) : null,"); } else if (child is ListModelType listModelType) { if (this is UserDefinedGenericModelType type) { if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,"); } else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType)) { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,"); } else if (listModelType.GenericArgumentModelType is EnumModeType) { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,"); } else { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map)).toList() : null,"); } } else if (this is UserDefinedDerivedModelType definedDerivedModelType && definedDerivedModelType.BaseType is UserDefinedGenericModelType baseType) { if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,"); } else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType)) { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,"); } else if (listModelType.GenericArgumentModelType is EnumModeType) { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,"); } else { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map)).toList() : null,"); } } else if (this is UserDefinedModeType || this is UserDefinedDerivedModelType) { if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType)) { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,"); } else if (listModelType.GenericArgumentModelType is EnumModeType) { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,"); } else { var model = listModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map)).toList() : null,"); } } } else if (child is DictionaryModelType dictionaryModelType) { var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName(); var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{argumentName1},{argumentName2}>() : null,"); } else if (child is UserDefinedGenericModelType userDefinedGenericModelType) { if (this is UserDefinedGenericModelType type) { if (type.GenericArgumentModelType.ParameterType == userDefinedGenericModelType.GenericArgumentModelType.ParameterType) { source.AppendLine($"\t\t\t{child.Name_Lower}: {userDefinedGenericModelType.Name_Lower}List,"); } else if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType)) { var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,"); } else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModeType) { var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,"); } else { var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map)).toList() : null,"); } } else if (this is UserDefinedModeType) { if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType)) { var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,"); } else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModeType) { var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,"); } else { var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName(); source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map)).toList() : null,"); } } } else if (child is UserDefinedModeType || child is UserDefinedDerivedModelType) { source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.fromJson(map['{child.Name_Upper}']) : null,"); } else if (child is DoubleModeType) { source.AppendLine($"\t\t\t{child.Name_Lower}: double.parse(map['{child.Name_Upper}']),"); } else { source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],"); } } source.AppendLine("\t\t);"); source.AppendLine("\t}"); source.AppendLine(); return source.ToString(); } } public class EnumModeType : ComplexModelType { private Dictionary _userDefinedEnumDictionary; public EnumModeType(Type type, string name) : base(type, name) { _userDefinedEnumDictionary = new Dictionary(); var fields = ParameterType.GetFields(); if (fields != null && fields.Length > 1) { for (int i = 1; i < fields.Length; i++) { var fieldName = fields[i].GetValue(null).ToString(); var fieldValue = (int)fields[i].GetValue(null); if (fieldValue < 0) { continue; } else { _userDefinedEnumDictionary.Add(fieldValue, fieldName); } } _userDefinedEnumDictionary = _userDefinedEnumDictionary.OrderBy(x => x.Key).ToDictionary(p => p.Key, o => o.Value); } var firstChildName = _userDefinedEnumDictionary.FirstOrDefault().Value; DefaultValue = $"{GetFlutterTypeName()}.{firstChildName}"; } public override string GetDartString() { var dartString = new StringBuilder(); dartString.AppendLine($"enum {GetFlutterTypeName()} {{"); int lastValue = 0; foreach (var userDefinedEnum in _userDefinedEnumDictionary) { var index = userDefinedEnum.Key; var name = userDefinedEnum.Value; while (lastValue != index) { dartString.AppendLine($"\tplaceHolder_{lastValue},"); lastValue++; } if (lastValue == index) { dartString.AppendLine($"\t{name},"); lastValue++; } } dartString.AppendLine("}"); return dartString.ToString(); } } public class EnumNullableModelType : ComplexModelType { public EnumNullableModelType(Type type, string name) : base(type, name) { } public override string GetDartString() { var dartString = new StringBuilder(); dartString.AppendLine($"enum {GetFlutterTypeName()} {{"); foreach (var enumvalue in Enum.GetNames(ParameterType)) { dartString.AppendLine($"\t{enumvalue},"); } dartString.AppendLine("}"); return dartString.ToString(); } } public class ArrayModelType : SimpleModelType { public ModelType Child; public ArrayModelType(Type type, string name) : base(type, name) { var arrayTypeName = ParameterType.FullName.Replace("[]", string.Empty); var arrayType = ParameterType.Assembly.GetType(arrayTypeName); Child = ModelTypeGenerator.Create(arrayType, ""); } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { var parameterTypeName = Child.GetFlutterTypeName(); if (Index > 1) { return $"List<{parameterTypeName}{Index}>"; } else { return $"List<{parameterTypeName}>"; } } } public class ListModelType : SimpleModelType { 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(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { if (isDefault) { return "List<" + GenericArgumentModelType.GetFlutterTypeName() + ">"; } if (isGenericName) { return "List"; } if (isSingle) { return "List"; } return "List<" + GenericArgumentModelType.GetFlutterTypeName() + " >"; } } /// /// Dictionary Type /// public class DictionaryModelType : SimpleModelType { public List GenericArgumentModelTypeList; public DictionaryModelType(Type type, string name) : base(type, name) { GenericArgumentModelTypeList = new List(); foreach (var argumentType in type.GetGenericArguments()) { var modelType = ModelTypeGenerator.Create(argumentType, ""); GenericArgumentModelTypeList.Add(modelType); } } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { if (isDefault) { return "Map<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">"; } if (isSingle) { return "Map"; } return "Map<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">"; } } /// /// User Defined Generic Complex Model Type /// public class UserDefinedGenericModelType : ComplexModelType { public ModelType GenericArgumentModelType; public UserDefinedGenericModelType(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(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { if (Index > 1) { if (isDefault) { return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">"; } if (isGenericName) { return ParameterType.Name[0..^2] + Index + ""; } if (isSingle) { return ParameterType.Name[0..^2] + Index; } return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">"; } else { if (isDefault) { return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">"; } if (isGenericName) { return ParameterType.Name[0..^2] + ""; } if (isSingle) { return ParameterType.Name[0..^2]; } return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">"; } } public override string GetDartString() { var dartString = new StringBuilder(); dartString.AppendLine($"class {GetFlutterTypeName(false, true)} {{"); foreach (var child in Children) { string argumentName; var questionMark = QuestionMarkCheck(child); if (child is ListModelType listModelType) { argumentName = GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType ? listModelType.GetFlutterTypeName(false, true) : listModelType.GetFlutterTypeName(); } else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType) { argumentName = GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType ? userDefinedGenericComplexModelType.GetFlutterTypeName(false, true) : userDefinedGenericComplexModelType.GetFlutterTypeName(); } else { argumentName = child.GetFlutterTypeName(); } dartString.AppendLine($"\t{argumentName}{questionMark} {child.Name_Lower};"); } dartString.AppendLine(); dartString.AppendLine($"\t{GetFlutterTypeName(false, false, true)}({{"); foreach (var child in Children) { if (child.DefaultValue != null) { dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},"); } else { dartString.AppendLine($"\t\tthis.{child.Name_Lower},"); } } dartString.AppendLine("\t});"); dartString.AppendLine(); dartString.Append(FromJson(Children)); dartString.Append(ToJson(Children)); dartString.AppendLine("}"); return dartString.ToString(); } } public class UserDefinedModeType : ComplexModelType { public UserDefinedModeType(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(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { if (Index > 1) { return $"{ParameterType.Name}{Index}"; } else { return $"{ParameterType.Name}"; } } public override string GetDartString() { var dartString = new StringBuilder(); dartString.AppendLine($"class {GetFlutterTypeName()} {{"); foreach (var child in Children) { var questionMark = QuestionMarkCheck(child); if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType) { dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};"); } else { dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};"); } } dartString.AppendLine(); if (Children.Count == 0) { dartString.AppendLine($"\t{GetFlutterTypeName()}();"); } else { dartString.AppendLine($"\t{GetFlutterTypeName()}({{"); foreach (var child in Children) { if (child.DefaultValue != null) { dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},"); } else { dartString.AppendLine($"\t\tthis.{child.Name_Lower},"); } } dartString.AppendLine("\t});"); } dartString.AppendLine(); dartString.Append(FromJson(Children)); dartString.Append(ToJson(Children)); dartString.AppendLine("}"); return dartString.ToString(); } } public class UserDefinedDerivedModelType : ComplexModelType { public ModelType BaseType; public UserDefinedDerivedModelType(Type type, string name) : base(type, name) { BaseType = ModelTypeGenerator.Create(type.BaseType, ""); if (!(BaseType is UserDefinedGenericModelType)) { var properties = type.GetProperties(); foreach (var property in properties) { var child = ModelTypeGenerator.Create(property.PropertyType, property.Name); Children.Add(child); } } } public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false) { if (Index > 1) { return $"{ParameterType.Name}{Index}"; } else { return $"{ParameterType.Name}"; } } public override string GetDartString() { var dartString = new StringBuilder(); dartString.AppendLine($"class {GetFlutterTypeName()} extends {BaseType.GetFlutterTypeName()}{{"); var baseType = BaseType as ComplexModelType; foreach (var child in Children) { if (baseType != null) { if (!baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper)) { var questionMark = QuestionMarkCheck(child); if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType) { dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};"); } else { dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};"); } } else { continue; } } else { var questionMark = QuestionMarkCheck(child); if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType) { dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};"); } else { dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};"); } } } dartString.AppendLine(); if (Children.Count == 0) { dartString.AppendLine($"\t{GetFlutterTypeName()}("); if (baseType != null && !(baseType is UserDefinedGenericModelType)) { dartString.AppendLine($"\t) : super("); foreach (var child in baseType.Children) { dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},"); } dartString.AppendLine($"\t\t);"); } else { dartString.AppendLine("\t);"); } } else { dartString.AppendLine($"\t{GetFlutterTypeName()}({{"); foreach (var child in Children) { if (baseType != null) { if (baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper)) { var questionMark = QuestionMarkCheck(child); if (child.DefaultValue != null) { if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType) { dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower} = {child.DefaultValue},"); } else { dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower} = {child.DefaultValue},"); } } else { if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType) { dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower},"); } else { dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower},"); } } } else { if (child.DefaultValue != null) { dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},"); } else { dartString.AppendLine($"\t\tthis.{child.Name_Lower},"); } } } else { if (child.DefaultValue != null) { dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},"); } else { dartString.AppendLine($"\t\tthis.{child.Name_Lower},"); } } } if (baseType != null) { dartString.AppendLine($"\t}}) : super("); foreach (var child in baseType.Children) { dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},"); } dartString.AppendLine($"\t\t);"); } else { dartString.AppendLine("\t});"); } } dartString.AppendLine(); dartString.Append(FromJson(Children)); dartString.Append(ToJson(Children)); dartString.AppendLine("}"); return dartString.ToString(); } protected override string ToJson(List Children) { var source = new StringBuilder(); source.AppendLine("\tMap toJson() {"); source.AppendLine("\t\tfinal map = super.toJson();"); foreach (var child in Children) { if (BaseType is ComplexModelType complexModelType) { if (!complexModelType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper)) { if (child is EnumModeType) { source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;"); } else if (child.DefaultValue != null) { source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};"); } else if (child is DateTimeModeType) { source.AppendLine($"\t\tif({child.Name_Lower} != null)"); source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);"); } else { source.AppendLine($"\t\tif({child.Name_Lower} != null)"); source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};"); } } } } source.AppendLine("\t\treturn map;"); source.AppendLine("\t}"); return source.ToString(); } } }