ModeType.cs 44 KB

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