ModeType.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  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 == map[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 == map[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 == map[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 == map[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 == map[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
  428. {
  429. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
  430. }
  431. }
  432. source.AppendLine("\t\t);");
  433. source.AppendLine("\t}");
  434. source.AppendLine();
  435. return source.ToString();
  436. }
  437. }
  438. public class EnumModeType : ComplexModelType
  439. {
  440. private Dictionary<int, string> _userDefinedEnumDictionary;
  441. public EnumModeType(Type type, string name) : base(type, name)
  442. {
  443. _userDefinedEnumDictionary = new Dictionary<int, string>();
  444. var fields = ParameterType.GetFields();
  445. if (fields != null && fields.Length > 1)
  446. {
  447. for (int i = 1; i < fields.Length; i++)
  448. {
  449. var fieldName = fields[i].GetValue(null).ToString();
  450. var fieldValue = (int)fields[i].GetValue(null);
  451. if (fieldValue < 0)
  452. {
  453. continue;
  454. }
  455. else
  456. {
  457. _userDefinedEnumDictionary.Add(fieldValue, fieldName);
  458. }
  459. }
  460. _userDefinedEnumDictionary = _userDefinedEnumDictionary.OrderBy(x => x.Key).ToDictionary(p => p.Key, o => o.Value);
  461. }
  462. var firstChildName = _userDefinedEnumDictionary.FirstOrDefault().Value;
  463. DefaultValue = $"{GetFlutterTypeName()}.{firstChildName}";
  464. }
  465. public override string GetDartString()
  466. {
  467. var dartString = new StringBuilder();
  468. dartString.AppendLine($"enum {GetFlutterTypeName()} {{");
  469. int lastValue = 0;
  470. foreach (var userDefinedEnum in _userDefinedEnumDictionary)
  471. {
  472. var index = userDefinedEnum.Key;
  473. var name = userDefinedEnum.Value;
  474. while (lastValue != index)
  475. {
  476. dartString.AppendLine($"\tplaceHolder_{lastValue},");
  477. lastValue++;
  478. }
  479. if (lastValue == index)
  480. {
  481. dartString.AppendLine($"\t{name},");
  482. lastValue++;
  483. }
  484. }
  485. dartString.AppendLine("}");
  486. return dartString.ToString();
  487. }
  488. }
  489. public class EnumNullableModelType : ComplexModelType
  490. {
  491. public EnumNullableModelType(Type type, string name) : base(type, name)
  492. {
  493. }
  494. public override string GetDartString()
  495. {
  496. var dartString = new StringBuilder();
  497. dartString.AppendLine($"enum {GetFlutterTypeName()} {{");
  498. foreach (var enumvalue in Enum.GetNames(ParameterType))
  499. {
  500. dartString.AppendLine($"\t{enumvalue},");
  501. }
  502. dartString.AppendLine("}");
  503. return dartString.ToString();
  504. }
  505. }
  506. public class ArrayModelType : SimpleModelType
  507. {
  508. public ModelType Child;
  509. public ArrayModelType(Type type, string name) : base(type, name)
  510. {
  511. var arrayTypeName = ParameterType.FullName.Replace("[]", string.Empty);
  512. var arrayType = ParameterType.Assembly.GetType(arrayTypeName);
  513. Child = ModelTypeGenerator.Create(arrayType, "");
  514. }
  515. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  516. {
  517. var parameterTypeName = Child.GetFlutterTypeName();
  518. if (Index > 1)
  519. {
  520. return $"List<{parameterTypeName}{Index}>";
  521. }
  522. else
  523. {
  524. return $"List<{parameterTypeName}>";
  525. }
  526. }
  527. }
  528. public class ListModelType : SimpleModelType
  529. {
  530. public ModelType GenericArgumentModelType;
  531. public ListModelType(Type type, string name) : base(type, name)
  532. {
  533. var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
  534. GenericArgumentModelType = modelType;
  535. }
  536. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  537. {
  538. if (isDefault)
  539. {
  540. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  541. }
  542. if (isGenericName)
  543. {
  544. return ParameterType.Name[0..^2] + "<T>";
  545. }
  546. if (isSingle)
  547. {
  548. return ParameterType.Name[0..^2];
  549. }
  550. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  551. }
  552. }
  553. /// <summary>
  554. /// Dictionary Type
  555. /// </summary>
  556. public class DictionaryModelType : SimpleModelType
  557. {
  558. public List<ModelType> GenericArgumentModelTypeList;
  559. public DictionaryModelType(Type type, string name) : base(type, name)
  560. {
  561. GenericArgumentModelTypeList = new List<ModelType>();
  562. foreach (var argumentType in type.GetGenericArguments())
  563. {
  564. var modelType = ModelTypeGenerator.Create(argumentType, "");
  565. GenericArgumentModelTypeList.Add(modelType);
  566. }
  567. }
  568. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  569. {
  570. var flutterTypeName = ParameterType.Name[0..^2].Replace("Dictionary", "Map");
  571. if (isDefault)
  572. {
  573. flutterTypeName += "<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">";
  574. return flutterTypeName;
  575. }
  576. if (isSingle)
  577. {
  578. return ParameterType.Name[0..^2].Replace("Dictionary", "Map");
  579. }
  580. flutterTypeName += "<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">";
  581. return flutterTypeName;
  582. }
  583. }
  584. /// <summary>
  585. /// User Defined Generic Complex Model Type
  586. /// </summary>
  587. public class UserDefinedGenericModelType : ComplexModelType
  588. {
  589. public ModelType GenericArgumentModelType;
  590. public UserDefinedGenericModelType(Type type, string name) : base(type, name)
  591. {
  592. var properties = type.GetProperties();
  593. foreach (var property in properties)
  594. {
  595. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  596. Children.Add(child);
  597. }
  598. var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
  599. GenericArgumentModelType = modelType;
  600. }
  601. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  602. {
  603. if (Index > 1)
  604. {
  605. if (isDefault)
  606. {
  607. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">";
  608. }
  609. if (isGenericName)
  610. {
  611. return ParameterType.Name[0..^2] + Index + "<T>";
  612. }
  613. if (isSingle)
  614. {
  615. return ParameterType.Name[0..^2] + Index;
  616. }
  617. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + Index + ">";
  618. }
  619. else
  620. {
  621. if (isDefault)
  622. {
  623. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  624. }
  625. if (isGenericName)
  626. {
  627. return ParameterType.Name[0..^2] + "<T>";
  628. }
  629. if (isSingle)
  630. {
  631. return ParameterType.Name[0..^2];
  632. }
  633. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  634. }
  635. }
  636. public override string GetDartString()
  637. {
  638. var dartString = new StringBuilder();
  639. dartString.AppendLine($"class {GetFlutterTypeName(false, true)} {{");
  640. foreach (var child in Children)
  641. {
  642. string argumentName;
  643. var questionMark = QuestionMarkCheck(child);
  644. if (child is ListModelType listModelType)
  645. {
  646. argumentName = GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType ? listModelType.GetFlutterTypeName(false, true) : listModelType.GetFlutterTypeName();
  647. }
  648. else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
  649. {
  650. argumentName = GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType ? userDefinedGenericComplexModelType.GetFlutterTypeName(false, true) : userDefinedGenericComplexModelType.GetFlutterTypeName();
  651. }
  652. else
  653. {
  654. argumentName = child.GetFlutterTypeName();
  655. }
  656. dartString.AppendLine($"\t{argumentName}{questionMark} {child.Name_Lower};");
  657. }
  658. dartString.AppendLine();
  659. dartString.AppendLine($"\t{GetFlutterTypeName(false, false, true)}({{");
  660. foreach (var child in Children)
  661. {
  662. if (child.DefaultValue != null)
  663. {
  664. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  665. }
  666. else
  667. {
  668. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  669. }
  670. }
  671. dartString.AppendLine("\t});");
  672. dartString.AppendLine();
  673. dartString.Append(FromJson(Children));
  674. dartString.Append(ToJson(Children));
  675. dartString.AppendLine("}");
  676. return dartString.ToString();
  677. }
  678. }
  679. public class UserDefinedModeType : ComplexModelType
  680. {
  681. public UserDefinedModeType(Type type, string name) : base(type, name)
  682. {
  683. var properties = type.GetProperties();
  684. foreach (var property in properties)
  685. {
  686. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  687. Children.Add(child);
  688. }
  689. }
  690. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  691. {
  692. if (Index > 1)
  693. {
  694. return $"{ParameterType.Name}{Index}";
  695. }
  696. else
  697. {
  698. return $"{ParameterType.Name}";
  699. }
  700. }
  701. public override string GetDartString()
  702. {
  703. var dartString = new StringBuilder();
  704. dartString.AppendLine($"class {GetFlutterTypeName()} {{");
  705. foreach (var child in Children)
  706. {
  707. var questionMark = QuestionMarkCheck(child);
  708. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  709. {
  710. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  711. }
  712. else
  713. {
  714. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  715. }
  716. }
  717. dartString.AppendLine();
  718. if (Children.Count == 0)
  719. {
  720. dartString.AppendLine($"\t{GetFlutterTypeName()}();");
  721. }
  722. else
  723. {
  724. dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
  725. foreach (var child in Children)
  726. {
  727. if (child.DefaultValue != null)
  728. {
  729. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  730. }
  731. else
  732. {
  733. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  734. }
  735. }
  736. dartString.AppendLine("\t});");
  737. }
  738. dartString.AppendLine();
  739. dartString.Append(FromJson(Children));
  740. dartString.Append(ToJson(Children));
  741. dartString.AppendLine("}");
  742. return dartString.ToString();
  743. }
  744. }
  745. public class UserDefinedDerivedModelType : ComplexModelType
  746. {
  747. public ModelType BaseType;
  748. public UserDefinedDerivedModelType(Type type, string name) : base(type, name)
  749. {
  750. BaseType = ModelTypeGenerator.Create(type.BaseType, "");
  751. if (!(BaseType is UserDefinedGenericModelType))
  752. {
  753. var properties = type.GetProperties();
  754. foreach (var property in properties)
  755. {
  756. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  757. Children.Add(child);
  758. }
  759. }
  760. }
  761. public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
  762. {
  763. if (Index > 1)
  764. {
  765. return $"{ParameterType.Name}{Index}";
  766. }
  767. else
  768. {
  769. return $"{ParameterType.Name}";
  770. }
  771. }
  772. public override string GetDartString()
  773. {
  774. var dartString = new StringBuilder();
  775. dartString.AppendLine($"class {GetFlutterTypeName()} extends {BaseType.GetFlutterTypeName()}{{");
  776. var baseType = BaseType as ComplexModelType;
  777. foreach (var child in Children)
  778. {
  779. if (baseType != null)
  780. {
  781. if (!baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
  782. {
  783. var questionMark = QuestionMarkCheck(child);
  784. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  785. {
  786. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  787. }
  788. else
  789. {
  790. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  791. }
  792. }
  793. else
  794. {
  795. continue;
  796. }
  797. }
  798. else
  799. {
  800. var questionMark = QuestionMarkCheck(child);
  801. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  802. {
  803. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  804. }
  805. else
  806. {
  807. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  808. }
  809. }
  810. }
  811. dartString.AppendLine();
  812. if (Children.Count == 0)
  813. {
  814. dartString.AppendLine($"\t{GetFlutterTypeName()}(");
  815. if (baseType != null && !(baseType is UserDefinedGenericModelType))
  816. {
  817. dartString.AppendLine($"\t) : super(");
  818. foreach (var child in baseType.Children)
  819. {
  820. dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},");
  821. }
  822. dartString.AppendLine($"\t\t);");
  823. }
  824. else
  825. {
  826. dartString.AppendLine("\t);");
  827. }
  828. }
  829. else
  830. {
  831. dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
  832. foreach (var child in Children)
  833. {
  834. if (baseType != null)
  835. {
  836. if (baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
  837. {
  838. var questionMark = QuestionMarkCheck(child);
  839. if (child.DefaultValue != null)
  840. {
  841. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  842. {
  843. dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower} = {child.DefaultValue},");
  844. }
  845. else
  846. {
  847. dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower} = {child.DefaultValue},");
  848. }
  849. }
  850. else
  851. {
  852. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
  853. {
  854. dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower},");
  855. }
  856. else
  857. {
  858. dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower},");
  859. }
  860. }
  861. }
  862. else
  863. {
  864. if (child.DefaultValue != null)
  865. {
  866. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  867. }
  868. else
  869. {
  870. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  871. }
  872. }
  873. }
  874. else
  875. {
  876. if (child.DefaultValue != null)
  877. {
  878. dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
  879. }
  880. else
  881. {
  882. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  883. }
  884. }
  885. }
  886. if (baseType != null)
  887. {
  888. dartString.AppendLine($"\t}}) : super(");
  889. foreach (var child in baseType.Children)
  890. {
  891. dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},");
  892. }
  893. dartString.AppendLine($"\t\t);");
  894. }
  895. else
  896. {
  897. dartString.AppendLine("\t});");
  898. }
  899. }
  900. dartString.AppendLine();
  901. dartString.Append(FromJson(Children));
  902. dartString.Append(ToJson(Children));
  903. dartString.AppendLine("}");
  904. return dartString.ToString();
  905. }
  906. protected override string ToJson(List<ModelType> Children)
  907. {
  908. var source = new StringBuilder();
  909. source.AppendLine("\tMap<String, dynamic> toJson() {");
  910. source.AppendLine("\t\tfinal map = super.toJson();");
  911. foreach (var child in Children)
  912. {
  913. if (BaseType is ComplexModelType complexModelType)
  914. {
  915. if (!complexModelType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
  916. {
  917. if (child is EnumModeType)
  918. {
  919. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
  920. }
  921. else if (child.DefaultValue != null)
  922. {
  923. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  924. }
  925. else if (child is DateTimeModeType)
  926. {
  927. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  928. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
  929. }
  930. else
  931. {
  932. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  933. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  934. }
  935. }
  936. }
  937. }
  938. source.AppendLine("\t\treturn map;");
  939. source.AppendLine("\t}");
  940. return source.ToString();
  941. }
  942. }
  943. }