ComplexModelType.cs 21 KB

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