ComplexModelType.cs 21 KB

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