vars.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. package dartgen
  2. import "text/template"
  3. var funcMap = template.FuncMap{
  4. "getBaseName": getBaseName,
  5. "getPropertyFromMember": getPropertyFromMember,
  6. "isDirectType": isDirectType,
  7. "isAtomicType": isAtomicType,
  8. "isNumberType": isNumberType,
  9. "isClassListType": isClassListType,
  10. "isAtomicListType": isAtomicListType,
  11. "isListItemsNullable": isListItemsNullable,
  12. "isNullableType": isNullableType,
  13. "appendNullCoalescing": appendNullCoalescing,
  14. "appendDefaultEmptyValue": appendDefaultEmptyValue,
  15. "getCoreType": getCoreType,
  16. "lowCamelCase": lowCamelCase,
  17. "normalizeHandlerName": normalizeHandlerName,
  18. "hasUrlPathParams": hasUrlPathParams,
  19. "extractPositionalParamsFromPath": extractPositionalParamsFromPath,
  20. "makeDartRequestUrlPath": makeDartRequestUrlPath,
  21. "isMapType": isMapType,
  22. }
  23. const (
  24. apiFileContent = `import 'dart:io';
  25. import 'dart:convert';
  26. import '../vars/kv.dart';
  27. import '../vars/vars.dart';
  28. /// 发送POST请求.
  29. ///
  30. /// data:为你要post的结构体,我们会帮你转换成json字符串;
  31. /// ok函数:请求成功的时候调用,fail函数:请求失败的时候会调用,eventually函数:无论成功失败都会调用
  32. Future apiPost(String path, dynamic data,
  33. {Map<String, String> header,
  34. Function(Map<String, dynamic>) ok,
  35. Function(String) fail,
  36. Function eventually}) async {
  37. await _apiRequest('POST', path, data,
  38. header: header, ok: ok, fail: fail, eventually: eventually);
  39. }
  40. /// 发送GET请求.
  41. ///
  42. /// ok函数:请求成功的时候调用,fail函数:请求失败的时候会调用,eventually函数:无论成功失败都会调用
  43. Future apiGet(String path,
  44. {Map<String, String> header,
  45. Function(Map<String, dynamic>) ok,
  46. Function(String) fail,
  47. Function eventually}) async {
  48. await _apiRequest('GET', path, null,
  49. header: header, ok: ok, fail: fail, eventually: eventually);
  50. }
  51. Future _apiRequest(String method, String path, dynamic data,
  52. {Map<String, String> header,
  53. Function(Map<String, dynamic>) ok,
  54. Function(String) fail,
  55. Function eventually}) async {
  56. var tokens = await getTokens();
  57. try {
  58. var client = HttpClient();
  59. HttpClientRequest r;
  60. if (method == 'POST') {
  61. r = await client.postUrl(Uri.parse(serverHost + path));
  62. } else {
  63. r = await client.getUrl(Uri.parse(serverHost + path));
  64. }
  65. var strData = '';
  66. if (data != null) {
  67. strData = jsonEncode(data);
  68. }
  69. if (method == 'POST') {
  70. r.headers.set('Content-Type', 'application/json; charset=utf-8');
  71. r.headers.set('Content-Length', utf8.encode(strData).length);
  72. }
  73. if (tokens != null) {
  74. r.headers.set('Authorization', tokens.accessToken);
  75. }
  76. if (header != null) {
  77. header.forEach((k, v) {
  78. r.headers.set(k, v);
  79. });
  80. }
  81. r.write(strData);
  82. var rp = await r.close();
  83. var body = await rp.transform(utf8.decoder).join();
  84. print('${rp.statusCode} - $path');
  85. print('-- request --');
  86. print(strData);
  87. print('-- response --');
  88. print('$body \n');
  89. if (rp.statusCode == 404) {
  90. if (fail != null) fail('404 not found');
  91. } else {
  92. Map<String, dynamic> base = jsonDecode(body);
  93. if (rp.statusCode == 200) {
  94. if (base['code'] != 0) {
  95. if (fail != null) fail(base['desc']);
  96. } else {
  97. if (ok != null) ok(base['data']);
  98. }
  99. } else if (base['code'] != 0) {
  100. if (fail != null) fail(base['desc']);
  101. }
  102. }
  103. } catch (e) {
  104. if (fail != null) fail(e.toString());
  105. }
  106. if (eventually != null) eventually();
  107. }
  108. `
  109. apiFileContentV2 = `import 'dart:io';
  110. import 'dart:convert';
  111. import '../vars/kv.dart';
  112. import '../vars/vars.dart';
  113. /// send request with post method
  114. ///
  115. /// data: any request class that will be converted to json automatically
  116. /// ok: is called when request succeeds
  117. /// fail: is called when request fails
  118. /// eventually: is always called until the nearby functions returns
  119. Future apiPost(String path, dynamic data,
  120. {Map<String, String>? header,
  121. Function(Map<String, dynamic>)? ok,
  122. Function(String)? fail,
  123. Function? eventually}) async {
  124. await _apiRequest('POST', path, data,
  125. header: header, ok: ok, fail: fail, eventually: eventually);
  126. }
  127. /// send request with get method
  128. ///
  129. /// ok: is called when request succeeds
  130. /// fail: is called when request fails
  131. /// eventually: is always called until the nearby functions returns
  132. Future apiGet(String path,
  133. {Map<String, String>? header,
  134. Function(Map<String, dynamic>)? ok,
  135. Function(String)? fail,
  136. Function? eventually}) async {
  137. await _apiRequest('GET', path, null,
  138. header: header, ok: ok, fail: fail, eventually: eventually);
  139. }
  140. Future _apiRequest(String method, String path, dynamic data,
  141. {Map<String, String>? header,
  142. Function(Map<String, dynamic>)? ok,
  143. Function(String)? fail,
  144. Function? eventually}) async {
  145. var tokens = await getTokens();
  146. try {
  147. var client = HttpClient();
  148. HttpClientRequest r;
  149. if (method == 'POST') {
  150. r = await client.postUrl(Uri.parse(serverHost + path));
  151. } else {
  152. r = await client.getUrl(Uri.parse(serverHost + path));
  153. }
  154. var strData = '';
  155. if (data != null) {
  156. strData = jsonEncode(data);
  157. }
  158. if (method == 'POST') {
  159. r.headers.set('Content-Type', 'application/json; charset=utf-8');
  160. r.headers.set('Content-Length', utf8.encode(strData).length);
  161. }
  162. if (tokens != null) {
  163. r.headers.set('Authorization', tokens.accessToken);
  164. }
  165. if (header != null) {
  166. header.forEach((k, v) {
  167. r.headers.set(k, v);
  168. });
  169. }
  170. r.write(strData);
  171. var rp = await r.close();
  172. var body = await rp.transform(utf8.decoder).join();
  173. print('${rp.statusCode} - $path');
  174. print('-- request --');
  175. print(strData);
  176. print('-- response --');
  177. print('$body \n');
  178. if (rp.statusCode == 404) {
  179. if (fail != null) fail('404 not found');
  180. } else {
  181. Map<String, dynamic> base = jsonDecode(body);
  182. if (rp.statusCode == 200) {
  183. if (base['code'] != 0) {
  184. if (fail != null) fail(base['desc']);
  185. } else {
  186. if (ok != null) ok(base['data']);
  187. }
  188. } else if (base['code'] != 0) {
  189. if (fail != null) fail(base['desc']);
  190. }
  191. }
  192. } catch (e) {
  193. if (fail != null) fail(e.toString());
  194. }
  195. if (eventually != null) eventually();
  196. }`
  197. tokensFileContent = `class Tokens {
  198. /// 用于访问的token, 每次请求都必须带在Header里面
  199. final String accessToken;
  200. final int accessExpire;
  201. /// 用于刷新token
  202. final String refreshToken;
  203. final int refreshExpire;
  204. final int refreshAfter;
  205. Tokens(
  206. {this.accessToken,
  207. this.accessExpire,
  208. this.refreshToken,
  209. this.refreshExpire,
  210. this.refreshAfter});
  211. factory Tokens.fromJson(Map<String, dynamic> m) {
  212. return Tokens(
  213. accessToken: m['access_token'],
  214. accessExpire: m['access_expire'],
  215. refreshToken: m['refresh_token'],
  216. refreshExpire: m['refresh_expire'],
  217. refreshAfter: m['refresh_after']);
  218. }
  219. Map<String, dynamic> toJson() {
  220. return {
  221. 'access_token': accessToken,
  222. 'access_expire': accessExpire,
  223. 'refresh_token': refreshToken,
  224. 'refresh_expire': refreshExpire,
  225. 'refresh_after': refreshAfter,
  226. };
  227. }
  228. }
  229. `
  230. tokensFileContentV2 = `class Tokens {
  231. /// 用于访问的token, 每次请求都必须带在Header里面
  232. final String accessToken;
  233. final int accessExpire;
  234. /// 用于刷新token
  235. final String refreshToken;
  236. final int refreshExpire;
  237. final int refreshAfter;
  238. Tokens({
  239. required this.accessToken,
  240. required this.accessExpire,
  241. required this.refreshToken,
  242. required this.refreshExpire,
  243. required this.refreshAfter
  244. });
  245. factory Tokens.fromJson(Map<String, dynamic> m) {
  246. return Tokens(
  247. accessToken: m['access_token'],
  248. accessExpire: m['access_expire'],
  249. refreshToken: m['refresh_token'],
  250. refreshExpire: m['refresh_expire'],
  251. refreshAfter: m['refresh_after']);
  252. }
  253. Map<String, dynamic> toJson() {
  254. return {
  255. 'access_token': accessToken,
  256. 'access_expire': accessExpire,
  257. 'refresh_token': refreshToken,
  258. 'refresh_expire': refreshExpire,
  259. 'refresh_after': refreshAfter,
  260. };
  261. }
  262. }
  263. `
  264. )