ComplexModelType.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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
  141. {
  142. 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,");
  143. }
  144. }
  145. else if (child is DateTimeModelType)
  146. {
  147. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? DateTime.parse(map['{child.Name_Upper}']) : null,");
  148. }
  149. else if (child is ListModelType listModelType)
  150. {
  151. if (this is UserDefinedGenericModelType type)
  152. {
  153. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  154. {
  155. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  156. }
  157. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  158. {
  159. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  160. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  161. }
  162. else if (listModelType.GenericArgumentModelType is EnumModelType)
  163. {
  164. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  165. 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,");
  166. }
  167. else
  168. {
  169. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  170. 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,");
  171. }
  172. }
  173. else if (this is UserDefinedDerivedModelType definedDerivedModelType && definedDerivedModelType.BaseType is UserDefinedGenericModelType baseType)
  174. {
  175. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  176. {
  177. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  178. }
  179. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  180. {
  181. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  182. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  183. }
  184. else if (listModelType.GenericArgumentModelType is EnumModelType)
  185. {
  186. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  187. 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,");
  188. }
  189. else
  190. {
  191. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  192. 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,");
  193. }
  194. }
  195. else if (this is UserDefinedModelType || this is UserDefinedDerivedModelType)
  196. {
  197. if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  198. {
  199. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  200. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  201. }
  202. else if (listModelType.GenericArgumentModelType is EnumModelType)
  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}.values.firstWhere((i) => i.index == e)).toList() : null,");
  206. }
  207. else
  208. {
  209. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  210. 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,");
  211. }
  212. }
  213. }
  214. else if (child is DictionaryModelType dictionaryModelType)
  215. {
  216. var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName();
  217. var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
  218. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{argumentName1},{argumentName2}>(),");
  219. }
  220. else if (child is UserDefinedGenericModelType userDefinedGenericModelType)
  221. {
  222. if (this is UserDefinedGenericModelType type)
  223. {
  224. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericModelType.GenericArgumentModelType.ParameterType)
  225. {
  226. source.AppendLine($"\t\t\t{child.Name_Lower}: {userDefinedGenericModelType.Name_Lower}List,");
  227. }
  228. else if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  229. {
  230. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  231. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  232. }
  233. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  234. {
  235. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  236. 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,");
  237. }
  238. else
  239. {
  240. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  241. 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,");
  242. }
  243. }
  244. else if (this is UserDefinedModelType)
  245. {
  246. if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  247. {
  248. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  249. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}']?.cast<{model}>().toList(),");
  250. }
  251. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  252. {
  253. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  254. 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,");
  255. }
  256. else
  257. {
  258. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  259. 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,");
  260. }
  261. }
  262. }
  263. else if (child is UserDefinedModelType || child is UserDefinedDerivedModelType || child is ExtraObjectModelType)
  264. {
  265. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.fromJson(map['{child.Name_Upper}']) : null,");
  266. }
  267. else if (child is DoubleModelType)
  268. {
  269. source.AppendLine($"\t\t\t{child.Name_Lower}: double.parse(map['{child.Name_Upper}'].toString()),");
  270. }
  271. else
  272. {
  273. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
  274. }
  275. }
  276. source.AppendLine("\t\t);");
  277. source.AppendLine("\t}");
  278. source.AppendLine();
  279. return source.ToString();
  280. }
  281. }
  282. }