ComplexModelType.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. using FlutterCodeGenerator.Helper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace FlutterCodeGenerator.ModelTypes
  6. {
  7. internal class ComplexModelType : ModelType
  8. {
  9. public List<ModelType> Children { get; set; }
  10. public ComplexModelType(Type type, string name) : base(type, name)
  11. {
  12. Children = new List<ModelType>();
  13. }
  14. protected virtual string ToJson(List<ModelType> Children)
  15. {
  16. var source = new StringBuilder();
  17. source.AppendLine("\tMap<String, dynamic> toJson() {");
  18. source.AppendLine("\t\tfinal map = Map<String, dynamic>();");
  19. foreach (var child in Children)
  20. {
  21. if (child is EnumModelType)
  22. {
  23. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
  24. }
  25. else if (child.DefaultValue != null)
  26. {
  27. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  28. }
  29. else if (child is DateTimeModelType)
  30. {
  31. source.AppendLine($"\t\tif ({child.Name_Lower} != null) {{");
  32. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
  33. source.AppendLine($"\t\t}}");
  34. }
  35. else
  36. {
  37. source.AppendLine($"\t\tif ({child.Name_Lower} != null) {{");
  38. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  39. source.AppendLine($"\t\t}}");
  40. }
  41. }
  42. source.AppendLine("\t\treturn map;");
  43. source.AppendLine("\t}");
  44. return source.ToString();
  45. }
  46. protected virtual string FromJson(List<ModelType> Children)
  47. {
  48. var source = new StringBuilder();
  49. string flutterTypeName = null;
  50. if (this is UserDefinedGenericModelType)
  51. {
  52. flutterTypeName = GetFlutterTypeName(false, false, true);
  53. }
  54. else
  55. {
  56. flutterTypeName = GetFlutterTypeName();
  57. }
  58. source.AppendLine($"\tfactory {flutterTypeName}.fromJson(Map<String, dynamic> map) {{");
  59. foreach (var child in Children)
  60. {
  61. if (child is ArrayModelType)
  62. {
  63. source.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];");
  64. }
  65. else if (child is ListModelType listModelType)
  66. {
  67. if (this is UserDefinedGenericModelType type)
  68. {
  69. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  70. {
  71. source.AppendLine($"\t\tList<T> {listModelType.Name_Lower}List = [];");
  72. source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
  73. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  74. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  75. source.AppendLine($"\t\t}}");
  76. }
  77. }
  78. else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
  79. {
  80. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  81. {
  82. source.AppendLine($"\t\tList<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}> {listModelType.Name_Lower}List = [];");
  83. source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
  84. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  85. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}>(e)!));");
  86. source.AppendLine($"\t\t}}");
  87. }
  88. }
  89. }
  90. else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
  91. {
  92. if (this is UserDefinedGenericModelType type)
  93. {
  94. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  95. {
  96. source.AppendLine($"\t\tList<T> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  97. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
  98. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  99. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  100. source.AppendLine($"\t\t}}");
  101. }
  102. else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
  103. {
  104. if (baseType.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  105. {
  106. source.AppendLine($"\t\tList<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  107. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
  108. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  109. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}>(e)!));");
  110. source.AppendLine($"\t\t}}");
  111. }
  112. }
  113. }
  114. }
  115. }
  116. source.AppendLine($"\t\treturn {flutterTypeName}( ");
  117. foreach (var child in Children)
  118. {
  119. if (child is EnumModelType)
  120. {
  121. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
  122. }
  123. else if (child is EnumNullableModelType)
  124. {
  125. 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,");
  126. }
  127. else if (child is ArrayModelType)
  128. {
  129. var arrayTypeName = child.ParameterType.FullName.Replace("[]", string.Empty);
  130. var arrayType = child.ParameterType.Assembly.GetType(arrayTypeName);
  131. var modelType = ModelTypeGenerator.Create(arrayType, "");
  132. if (modelType is ByteModelType)
  133. {
  134. 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,");
  135. }
  136. else if (modelType is SimpleModelType && (modelType is ExtraObjectModelType))
  137. {
  138. 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,");
  139. }
  140. else if (modelType is SimpleModelType)
  141. {
  142. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Lower}']?.cast<{child.ParameterType.Name.Replace("[]", string.Empty)}>().toList(),");
  143. }
  144. else
  145. {
  146. 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,");
  147. }
  148. }
  149. else if (child is DateTimeModelType)
  150. {
  151. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? DateTime.parse(map['{child.Name_Upper}']) : null,");
  152. }
  153. else if (child is ListModelType listModelType)
  154. {
  155. if (this is UserDefinedGenericModelType type)
  156. {
  157. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  158. {
  159. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  160. }
  161. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  162. {
  163. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  164. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  165. }
  166. else if (listModelType.GenericArgumentModelType is EnumModelType)
  167. {
  168. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  169. 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,");
  170. }
  171. else
  172. {
  173. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  174. 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<String,dynamic>)).toList() : null,");
  175. }
  176. }
  177. else if (this is UserDefinedDerivedModelType definedDerivedModelType && definedDerivedModelType.BaseType is UserDefinedGenericModelType baseType)
  178. {
  179. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  180. {
  181. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  182. }
  183. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  184. {
  185. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  186. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  187. }
  188. else if (listModelType.GenericArgumentModelType is EnumModelType)
  189. {
  190. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  191. 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,");
  192. }
  193. else
  194. {
  195. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  196. 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<String,dynamic>)).toList() : null,");
  197. }
  198. }
  199. else if (this is UserDefinedModelType || this is UserDefinedDerivedModelType)
  200. {
  201. if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  202. {
  203. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  204. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  205. }
  206. else if (listModelType.GenericArgumentModelType is EnumModelType)
  207. {
  208. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  209. 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,");
  210. }
  211. else
  212. {
  213. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  214. 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<String,dynamic>)).toList() : null,");
  215. }
  216. }
  217. }
  218. else if (child is DictionaryModelType dictionaryModelType)
  219. {
  220. var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName();
  221. var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
  222. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{argumentName1},{argumentName2}>(),");
  223. }
  224. else if (child is UserDefinedGenericModelType userDefinedGenericModelType)
  225. {
  226. if (this is UserDefinedGenericModelType type)
  227. {
  228. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericModelType.GenericArgumentModelType.ParameterType)
  229. {
  230. source.AppendLine($"\t\t\t{child.Name_Lower}: {userDefinedGenericModelType.Name_Lower}List,");
  231. }
  232. else if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  233. {
  234. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  235. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  236. }
  237. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  238. {
  239. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  240. 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,");
  241. }
  242. else
  243. {
  244. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  245. 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<String,dynamic>)).toList() : null,");
  246. }
  247. }
  248. else if (this is UserDefinedModelType)
  249. {
  250. if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  251. {
  252. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  253. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  254. }
  255. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  256. {
  257. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  258. 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,");
  259. }
  260. else
  261. {
  262. var model = userDefinedGenericModelType.GetFlutterTypeName();
  263. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {model}.fromJson(map['{child.Name_Upper}'] as Map<String,dynamic>) : null,");
  264. }
  265. }
  266. }
  267. else if (child is UserDefinedModelType || child is UserDefinedDerivedModelType || child is ExtraObjectModelType)
  268. {
  269. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.fromJson(map['{child.Name_Upper}']) : null,");
  270. }
  271. else if (child is DoubleModelType)
  272. {
  273. source.AppendLine($"\t\t\t{child.Name_Lower}: double.parse(map['{child.Name_Upper}'].toString()),");
  274. }
  275. else
  276. {
  277. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
  278. }
  279. }
  280. source.AppendLine("\t\t);");
  281. source.AppendLine("\t}");
  282. source.AppendLine();
  283. return source.ToString();
  284. }
  285. }
  286. }