ModelType.cs 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace FlutterCodeGenerator
  6. {
  7. public class ModelType
  8. {
  9. public Type ParameterType { get; set; }
  10. /// <summary>
  11. ///Name(First Character Lower Case)
  12. /// </summary>
  13. public string Name_Lower { get; set; }
  14. /// <summary>
  15. ///Name(First Character Upper Case)
  16. /// </summary>
  17. public string Name_Upper { get; set; }
  18. public string DefaultValue { get; set; }
  19. /// <summary>
  20. /// Index(For Same Name)
  21. /// </summary>
  22. public int Index { get; set; }
  23. public ModelType(Type type, string name)
  24. {
  25. ParameterType = type;
  26. Name_Lower = LetterConverterHelper.FirstCharToLower(name);
  27. Name_Upper = LetterConverterHelper.FirstCharToUpper(name);
  28. DefaultValue = null;
  29. Index = 1;
  30. }
  31. public virtual string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  32. {
  33. return ParameterType.Name;
  34. }
  35. public virtual string GetDartString()
  36. {
  37. return string.Empty;
  38. }
  39. protected string QuestionMarkCheck(ModelType child)
  40. {
  41. if (child.DefaultValue != null)
  42. {
  43. return "";
  44. }
  45. else
  46. {
  47. return "?";
  48. }
  49. }
  50. }
  51. public class SimpleModelType : ModelType
  52. {
  53. public SimpleModelType(Type type, string name) : base(type, name)
  54. {
  55. }
  56. }
  57. public class StringModelType : SimpleModelType
  58. {
  59. public StringModelType(string name) : base(typeof(string), name)
  60. {
  61. }
  62. }
  63. public class DateTimeModelType : SimpleModelType
  64. {
  65. public DateTimeModelType(string name) : base(typeof(DateTime), name)
  66. {
  67. }
  68. }
  69. public class IntModelType : SimpleModelType
  70. {
  71. public IntModelType(string name) : base(typeof(int), name)
  72. {
  73. DefaultValue = "0";
  74. }
  75. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  76. {
  77. return "int";
  78. }
  79. }
  80. public class IntNullableModelType : SimpleModelType
  81. {
  82. public IntNullableModelType(string name) : base(typeof(int?), name)
  83. {
  84. }
  85. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  86. {
  87. return "int";
  88. }
  89. }
  90. public class ByteModelType : SimpleModelType
  91. {
  92. public ByteModelType(string name) : base(typeof(byte), name)
  93. {
  94. DefaultValue = "0";
  95. }
  96. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  97. {
  98. return "int";
  99. }
  100. }
  101. public class ByteNullableModelType : SimpleModelType
  102. {
  103. public ByteNullableModelType(string name) : base(typeof(byte?), name)
  104. {
  105. }
  106. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  107. {
  108. return "int";
  109. }
  110. }
  111. public class VoidModelType : SimpleModelType
  112. {
  113. public VoidModelType(string name) : base(typeof(void), name)
  114. {
  115. }
  116. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  117. {
  118. return "void";
  119. }
  120. }
  121. public class DoubleModelType : SimpleModelType
  122. {
  123. public DoubleModelType(string name) : base(typeof(double), name)
  124. {
  125. DefaultValue = "0";
  126. }
  127. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  128. {
  129. return "double";
  130. }
  131. }
  132. public class DoubleNullableModelType : SimpleModelType
  133. {
  134. public DoubleNullableModelType(string name) : base(typeof(double?), name)
  135. {
  136. }
  137. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  138. {
  139. return "double";
  140. }
  141. }
  142. public class BoolModelType : SimpleModelType
  143. {
  144. public BoolModelType(string name) : base(typeof(bool), name)
  145. {
  146. DefaultValue = "false";
  147. }
  148. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  149. {
  150. return "bool";
  151. }
  152. }
  153. public class BoolNullableModelType : SimpleModelType
  154. {
  155. public BoolNullableModelType(string name) : base(typeof(bool?), name)
  156. {
  157. }
  158. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  159. {
  160. return "bool";
  161. }
  162. }
  163. public class InterfaceModelType : SimpleModelType
  164. {
  165. public InterfaceModelType(string name) : base(typeof(string), name)
  166. {
  167. }
  168. }
  169. public class ExtraObjectModelType : SimpleModelType
  170. {
  171. public ExtraObjectModelType(Type type, string name) : base(type, name)
  172. {
  173. }
  174. }
  175. public class ComplexModelType : ModelType
  176. {
  177. public List<ModelType> Children { get; set; }
  178. public ComplexModelType(Type type, string name) : base(type, name)
  179. {
  180. Children = new List<ModelType>();
  181. }
  182. protected virtual string ToJson(List<ModelType> Children)
  183. {
  184. var source = new StringBuilder();
  185. source.AppendLine("\tMap<String, dynamic> toJson() {");
  186. source.AppendLine("\t\tfinal map = Map<String, dynamic>();");
  187. foreach (var child in Children)
  188. {
  189. if (child is EnumModelType)
  190. {
  191. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
  192. }
  193. else if (child.DefaultValue != null)
  194. {
  195. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  196. }
  197. else if (child is DateTimeModelType)
  198. {
  199. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  200. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
  201. }
  202. else
  203. {
  204. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  205. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  206. }
  207. }
  208. source.AppendLine("\t\treturn map;");
  209. source.AppendLine("\t}");
  210. return source.ToString();
  211. }
  212. protected virtual string FromJson(List<ModelType> Children)
  213. {
  214. var source = new StringBuilder();
  215. string flutterTypeName = null;
  216. if (this is UserDefinedGenericModelType)
  217. {
  218. flutterTypeName = GetFlutterTypeName(false, false, true);
  219. }
  220. else
  221. {
  222. flutterTypeName = GetFlutterTypeName();
  223. }
  224. source.AppendLine($"\tfactory {flutterTypeName}.fromJson(Map<String, dynamic> map) {{");
  225. foreach (var child in Children)
  226. {
  227. if (child is ArrayModelType)
  228. {
  229. source.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];");
  230. }
  231. else if (child is ListModelType listModelType)
  232. {
  233. if (this is UserDefinedGenericModelType type)
  234. {
  235. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  236. {
  237. source.AppendLine($"\t\tList<T> {listModelType.Name_Lower}List = [];");
  238. source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
  239. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  240. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  241. source.AppendLine($"\t\t}}");
  242. }
  243. }
  244. else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
  245. {
  246. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  247. {
  248. source.AppendLine($"\t\tList<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}> {listModelType.Name_Lower}List = [];");
  249. source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
  250. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  251. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}>(e)!));");
  252. source.AppendLine($"\t\t}}");
  253. }
  254. }
  255. }
  256. else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
  257. {
  258. if (this is UserDefinedGenericModelType type)
  259. {
  260. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  261. {
  262. source.AppendLine($"\t\tList<T> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  263. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
  264. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  265. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  266. source.AppendLine($"\t\t}}");
  267. }
  268. else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
  269. {
  270. if (baseType.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  271. {
  272. source.AppendLine($"\t\tList<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  273. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
  274. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  275. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}>(e)!));");
  276. source.AppendLine($"\t\t}}");
  277. }
  278. }
  279. }
  280. }
  281. }
  282. source.AppendLine($"\t\treturn {flutterTypeName}( ");
  283. foreach (var child in Children)
  284. {
  285. if (child is EnumModelType)
  286. {
  287. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
  288. }
  289. else if (child is EnumNullableModelType)
  290. {
  291. 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,");
  292. }
  293. else if (child is ArrayModelType)
  294. {
  295. var arrayTypeName = child.ParameterType.FullName.Replace("[]", string.Empty);
  296. var arrayType = child.ParameterType.Assembly.GetType(arrayTypeName);
  297. var modelType = ModelTypeGenerator.Create(arrayType, "");
  298. if (modelType is ByteModelType)
  299. {
  300. 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,");
  301. }
  302. else if (modelType is SimpleModelType && (modelType is ExtraObjectModelType))
  303. {
  304. 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,");
  305. }
  306. else
  307. {
  308. 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,");
  309. }
  310. }
  311. else if (child is DateTimeModelType)
  312. {
  313. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? DateTime.parse(map['{child.Name_Upper}']) : null,");
  314. }
  315. else if (child is ListModelType listModelType)
  316. {
  317. if (this is UserDefinedGenericModelType type)
  318. {
  319. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  320. {
  321. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  322. }
  323. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  324. {
  325. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  326. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
  327. }
  328. else if (listModelType.GenericArgumentModelType is EnumModelType)
  329. {
  330. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  331. 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,");
  332. }
  333. else
  334. {
  335. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  336. 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,");
  337. }
  338. }
  339. else if (this is UserDefinedDerivedModelType definedDerivedModelType && definedDerivedModelType.BaseType is UserDefinedGenericModelType baseType)
  340. {
  341. if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  342. {
  343. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  344. }
  345. else if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  346. {
  347. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  348. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
  349. }
  350. else if (listModelType.GenericArgumentModelType is EnumModelType)
  351. {
  352. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  353. 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,");
  354. }
  355. else
  356. {
  357. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  358. 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,");
  359. }
  360. }
  361. else if (this is UserDefinedModelType || this is UserDefinedDerivedModelType)
  362. {
  363. if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
  364. {
  365. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  366. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
  367. }
  368. else if (listModelType.GenericArgumentModelType is EnumModelType)
  369. {
  370. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  371. 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,");
  372. }
  373. else
  374. {
  375. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  376. 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,");
  377. }
  378. }
  379. }
  380. else if (child is DictionaryModelType dictionaryModelType)
  381. {
  382. var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName();
  383. var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
  384. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{argumentName1},{argumentName2}>() : null,");
  385. }
  386. else if (child is UserDefinedGenericModelType userDefinedGenericModelType)
  387. {
  388. if (this is UserDefinedGenericModelType type)
  389. {
  390. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericModelType.GenericArgumentModelType.ParameterType)
  391. {
  392. source.AppendLine($"\t\t\t{child.Name_Lower}: {userDefinedGenericModelType.Name_Lower}List,");
  393. }
  394. else if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  395. {
  396. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  397. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
  398. }
  399. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  400. {
  401. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  402. 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,");
  403. }
  404. else
  405. {
  406. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  407. 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,");
  408. }
  409. }
  410. else if (this is UserDefinedModelType)
  411. {
  412. if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
  413. {
  414. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  415. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
  416. }
  417. else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
  418. {
  419. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  420. 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,");
  421. }
  422. else
  423. {
  424. var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
  425. 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,");
  426. }
  427. }
  428. }
  429. else if (child is UserDefinedModelType || child is UserDefinedDerivedModelType)
  430. {
  431. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.fromJson(map['{child.Name_Upper}']) : null,");
  432. }
  433. else if (child is DoubleModelType)
  434. {
  435. source.AppendLine($"\t\t\t{child.Name_Lower}: double.parse(map['{child.Name_Upper}'].toString()),");
  436. }
  437. else
  438. {
  439. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
  440. }
  441. }
  442. source.AppendLine("\t\t);");
  443. source.AppendLine("\t}");
  444. source.AppendLine();
  445. return source.ToString();
  446. }
  447. }
  448. public class EnumModelType : ComplexModelType
  449. {
  450. private Dictionary<int, string> _userDefinedEnumDictionary;
  451. public EnumModelType(Type type, string name) : base(type, name)
  452. {
  453. _userDefinedEnumDictionary = new Dictionary<int, string>();
  454. var fields = ParameterType.GetFields();
  455. if (fields != null && fields.Length > 1)
  456. {
  457. for (int i = 1; i < fields.Length; i++)
  458. {
  459. var fieldName = fields[i].GetValue(null).ToString();
  460. var fieldValue = (int)fields[i].GetValue(null);
  461. if (fieldValue < 0)
  462. {
  463. continue;
  464. }
  465. else
  466. {
  467. _userDefinedEnumDictionary.Add(fieldValue, fieldName);
  468. }
  469. }
  470. _userDefinedEnumDictionary = _userDefinedEnumDictionary.OrderBy(x => x.Key).ToDictionary(p => p.Key, o => o.Value);
  471. }
  472. var firstChildName = _userDefinedEnumDictionary.FirstOrDefault().Value;
  473. DefaultValue = $"{GetFlutterTypeName()}.{firstChildName}";
  474. }
  475. public override string GetDartString()
  476. {
  477. var dartString = new StringBuilder();
  478. dartString.AppendLine($"enum {GetFlutterTypeName()} {{");
  479. int lastValue = 0;
  480. foreach (var userDefinedEnum in _userDefinedEnumDictionary)
  481. {
  482. var index = userDefinedEnum.Key;
  483. var name = userDefinedEnum.Value;
  484. while (lastValue != index)
  485. {
  486. dartString.AppendLine($"\tplaceHolder_{lastValue},");
  487. lastValue++;
  488. }
  489. if (lastValue == index)
  490. {
  491. dartString.AppendLine($"\t{name},");
  492. lastValue++;
  493. }
  494. }
  495. dartString.AppendLine("}");
  496. return dartString.ToString();
  497. }
  498. }
  499. public class EnumNullableModelType : ComplexModelType
  500. {
  501. public EnumNullableModelType(Type type, string name) : base(type, name)
  502. {
  503. }
  504. public override string GetDartString()
  505. {
  506. var dartString = new StringBuilder();
  507. dartString.AppendLine($"enum {GetFlutterTypeName()} {{");
  508. foreach (var enumvalue in Enum.GetNames(ParameterType))
  509. {
  510. dartString.AppendLine($"\t{enumvalue},");
  511. }
  512. dartString.AppendLine("}");
  513. return dartString.ToString();
  514. }
  515. }
  516. public class ArrayModelType : SimpleModelType
  517. {
  518. public ModelType Child;
  519. public ArrayModelType(Type type, string name) : base(type, name)
  520. {
  521. var arrayTypeName = ParameterType.FullName.Replace("[]", string.Empty);
  522. var arrayType = ParameterType.Assembly.GetType(arrayTypeName);
  523. Child = ModelTypeGenerator.Create(arrayType, "");
  524. }
  525. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  526. {
  527. var parameterTypeName = Child.GetFlutterTypeName();
  528. if (Index > 1)
  529. {
  530. return $"List<{parameterTypeName}{Index}>";
  531. }
  532. else
  533. {
  534. return $"List<{parameterTypeName}>";
  535. }
  536. }
  537. }
  538. public class ListModelType : SimpleModelType
  539. {
  540. public ModelType GenericArgumentModelType;
  541. public ListModelType(Type type, string name) : base(type, name)
  542. {
  543. var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
  544. GenericArgumentModelType = modelType;
  545. }
  546. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  547. {
  548. if (isDefault)
  549. {
  550. return "List<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  551. }
  552. if (isGenericName)
  553. {
  554. return "List<T>";
  555. }
  556. if (isSingle)
  557. {
  558. return "List";
  559. }
  560. return "List<" + GenericArgumentModelType.GetFlutterTypeName() + " >";
  561. }
  562. }
  563. /// <summary>
  564. /// Dictionary Type
  565. /// </summary>
  566. public class DictionaryModelType : SimpleModelType
  567. {
  568. public List<ModelType> GenericArgumentModelTypeList;
  569. public DictionaryModelType(Type type, string name) : base(type, name)
  570. {
  571. GenericArgumentModelTypeList = new List<ModelType>();
  572. foreach (var argumentType in type.GetGenericArguments())
  573. {
  574. var modelType = ModelTypeGenerator.Create(argumentType, "");
  575. GenericArgumentModelTypeList.Add(modelType);
  576. }
  577. }
  578. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  579. {
  580. if (isDefault)
  581. {
  582. return "Map<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">";
  583. }
  584. if (isSingle)
  585. {
  586. return "Map";
  587. }
  588. return "Map<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">";
  589. }
  590. }
  591. /// <summary>
  592. /// User Defined Generic Complex Model Type
  593. /// </summary>
  594. public class UserDefinedGenericModelType : ComplexModelType
  595. {
  596. public ModelType GenericArgumentModelType;
  597. public UserDefinedGenericModelType(Type type, string name) : base(type, name)
  598. {
  599. var properties = type.GetProperties();
  600. foreach (var property in properties)
  601. {
  602. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  603. Children.Add(child);
  604. }
  605. var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
  606. GenericArgumentModelType = modelType;
  607. }
  608. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  609. {
  610. if (Index > 1)
  611. {
  612. if (isDefault)
  613. {
  614. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">";
  615. }
  616. if (isGenericName)
  617. {
  618. return ParameterType.Name[0..^2] + Index + "<T>";
  619. }
  620. if (isSingle)
  621. {
  622. return ParameterType.Name[0..^2] + Index;
  623. }
  624. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">";
  625. }
  626. else
  627. {
  628. if (isDefault)
  629. {
  630. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  631. }
  632. if (isGenericName)
  633. {
  634. return ParameterType.Name[0..^2] + "<T>";
  635. }
  636. if (isSingle)
  637. {
  638. return ParameterType.Name[0..^2];
  639. }
  640. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  641. }
  642. }
  643. public override string GetDartString()
  644. {
  645. var dartString = new StringBuilder();
  646. dartString.AppendLine($"class {GetFlutterTypeName(false, true)} {{");
  647. foreach (var child in Children)
  648. {
  649. string argumentName;
  650. var questionMark = QuestionMarkCheck(child);
  651. if (child is ListModelType listModelType)
  652. {
  653. argumentName = GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType ? listModelType.GetFlutterTypeName(false, true) : listModelType.GetFlutterTypeName();
  654. }
  655. else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
  656. {
  657. argumentName = GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType ? userDefinedGenericComplexModelType.GetFlutterTypeName(false, true) : userDefinedGenericComplexModelType.GetFlutterTypeName();
  658. }
  659. else
  660. {
  661. argumentName = child.GetFlutterTypeName();
  662. }
  663. dartString.AppendLine($"\t{argumentName}{questionMark} {child.Name_Lower};");
  664. }
  665. dartString.AppendLine();
  666. dartString.AppendLine($"\t{GetFlutterTypeName(false, false, true)}({{");
  667. foreach (var child in Children)
  668. {
  669. if (child.DefaultValue != null)
  670. {
  671. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  672. }
  673. else
  674. {
  675. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  676. }
  677. }
  678. dartString.AppendLine("\t});");
  679. dartString.AppendLine();
  680. dartString.Append(FromJson(Children));
  681. dartString.Append(ToJson(Children));
  682. dartString.AppendLine("}");
  683. return dartString.ToString();
  684. }
  685. }
  686. public class UserDefinedModelType : ComplexModelType
  687. {
  688. public UserDefinedModelType(Type type, string name) : base(type, name)
  689. {
  690. var properties = type.GetProperties();
  691. foreach (var property in properties)
  692. {
  693. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  694. Children.Add(child);
  695. }
  696. }
  697. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  698. {
  699. if (Index > 1)
  700. {
  701. return $"{ParameterType.Name}{Index}";
  702. }
  703. else
  704. {
  705. return $"{ParameterType.Name}";
  706. }
  707. }
  708. public override string GetDartString()
  709. {
  710. var dartString = new StringBuilder();
  711. dartString.AppendLine($"class {GetFlutterTypeName()} {{");
  712. foreach (var child in Children)
  713. {
  714. var questionMark = QuestionMarkCheck(child);
  715. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  716. {
  717. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  718. }
  719. else
  720. {
  721. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  722. }
  723. }
  724. dartString.AppendLine();
  725. if (Children.Count == 0)
  726. {
  727. dartString.AppendLine($"\t{GetFlutterTypeName()}();");
  728. }
  729. else
  730. {
  731. dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
  732. foreach (var child in Children)
  733. {
  734. if (child.DefaultValue != null)
  735. {
  736. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  737. }
  738. else
  739. {
  740. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  741. }
  742. }
  743. dartString.AppendLine("\t});");
  744. }
  745. dartString.AppendLine();
  746. dartString.Append(FromJson(Children));
  747. dartString.Append(ToJson(Children));
  748. dartString.AppendLine("}");
  749. return dartString.ToString();
  750. }
  751. }
  752. public class UserDefinedDerivedModelType : ComplexModelType
  753. {
  754. public ModelType BaseType;
  755. public UserDefinedDerivedModelType(Type type, string name) : base(type, name)
  756. {
  757. BaseType = ModelTypeGenerator.Create(type.BaseType, "");
  758. if (!(BaseType is UserDefinedGenericModelType))
  759. {
  760. var properties = type.GetProperties();
  761. foreach (var property in properties)
  762. {
  763. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  764. Children.Add(child);
  765. }
  766. }
  767. }
  768. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  769. {
  770. if (Index > 1)
  771. {
  772. return $"{ParameterType.Name}{Index}";
  773. }
  774. else
  775. {
  776. return $"{ParameterType.Name}";
  777. }
  778. }
  779. public override string GetDartString()
  780. {
  781. var dartString = new StringBuilder();
  782. dartString.AppendLine($"class {GetFlutterTypeName()} extends {BaseType.GetFlutterTypeName()}{{");
  783. var baseType = BaseType as ComplexModelType;
  784. foreach (var child in Children)
  785. {
  786. if (baseType != null)
  787. {
  788. if (!baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
  789. {
  790. var questionMark = QuestionMarkCheck(child);
  791. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  792. {
  793. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  794. }
  795. else
  796. {
  797. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  798. }
  799. }
  800. else
  801. {
  802. continue;
  803. }
  804. }
  805. else
  806. {
  807. var questionMark = QuestionMarkCheck(child);
  808. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  809. {
  810. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  811. }
  812. else
  813. {
  814. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  815. }
  816. }
  817. }
  818. dartString.AppendLine();
  819. if (Children.Count == 0)
  820. {
  821. dartString.AppendLine($"\t{GetFlutterTypeName()}(");
  822. if (baseType != null && !(baseType is UserDefinedGenericModelType))
  823. {
  824. dartString.AppendLine($"\t) : super(");
  825. foreach (var child in baseType.Children)
  826. {
  827. dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},");
  828. }
  829. dartString.AppendLine($"\t\t);");
  830. }
  831. else
  832. {
  833. dartString.AppendLine("\t);");
  834. }
  835. }
  836. else
  837. {
  838. dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
  839. foreach (var child in Children)
  840. {
  841. if (baseType != null)
  842. {
  843. if (baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
  844. {
  845. var questionMark = QuestionMarkCheck(child);
  846. if (child.DefaultValue != null)
  847. {
  848. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  849. {
  850. dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower} = {child.DefaultValue},");
  851. }
  852. else
  853. {
  854. dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower} = {child.DefaultValue},");
  855. }
  856. }
  857. else
  858. {
  859. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  860. {
  861. dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower},");
  862. }
  863. else
  864. {
  865. dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower},");
  866. }
  867. }
  868. }
  869. else
  870. {
  871. if (child.DefaultValue != null)
  872. {
  873. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  874. }
  875. else
  876. {
  877. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  878. }
  879. }
  880. }
  881. else
  882. {
  883. if (child.DefaultValue != null)
  884. {
  885. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  886. }
  887. else
  888. {
  889. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  890. }
  891. }
  892. }
  893. if (baseType != null)
  894. {
  895. dartString.AppendLine($"\t}}) : super(");
  896. foreach (var child in baseType.Children)
  897. {
  898. dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},");
  899. }
  900. dartString.AppendLine($"\t\t);");
  901. }
  902. else
  903. {
  904. dartString.AppendLine("\t});");
  905. }
  906. }
  907. dartString.AppendLine();
  908. dartString.Append(FromJson(Children));
  909. dartString.Append(ToJson(Children));
  910. dartString.AppendLine("}");
  911. return dartString.ToString();
  912. }
  913. protected override string ToJson(List<ModelType> Children)
  914. {
  915. var source = new StringBuilder();
  916. source.AppendLine("\tMap<String, dynamic> toJson() {");
  917. source.AppendLine("\t\tfinal map = super.toJson();");
  918. foreach (var child in Children)
  919. {
  920. if (BaseType is ComplexModelType complexModelType)
  921. {
  922. if (!complexModelType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
  923. {
  924. if (child is EnumModelType)
  925. {
  926. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
  927. }
  928. else if (child.DefaultValue != null)
  929. {
  930. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  931. }
  932. else if (child is DateTimeModelType)
  933. {
  934. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  935. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
  936. }
  937. else
  938. {
  939. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  940. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  941. }
  942. }
  943. }
  944. }
  945. source.AppendLine("\t\treturn map;");
  946. source.AppendLine("\t}");
  947. return source.ToString();
  948. }
  949. }
  950. }