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