using FlutterCodeGenerator.Helper; using System; using System.Text; namespace FlutterCodeGenerator.ModelTypes { /// /// User Defined Generic Complex Model Type /// internal 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(); } } }