create-mendix-widget-gleam 2.0.13 → 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/README.md +3 -2
  2. package/package.json +5 -1
  3. package/src/index.mjs +22 -7
  4. package/src/templates/readme_md.mjs +6 -6
  5. package/template/docs/glendix_guide.md +204 -1
  6. package/template/gleam.toml +1 -1
  7. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@command.cache +0 -0
  8. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@command.cache_inline +0 -0
  9. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@command.cache_meta +0 -0
  10. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@cursor.cache +0 -0
  11. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@cursor.cache_inline +0 -0
  12. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@cursor.cache_meta +0 -0
  13. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@event.cache +0 -0
  14. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@event.cache_inline +0 -0
  15. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@event.cache_meta +0 -0
  16. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@internal@consts.cache +0 -0
  17. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@internal@consts.cache_inline +0 -0
  18. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@internal@consts.cache_meta +0 -0
  19. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@stdout.cache +0 -0
  20. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@stdout.cache_inline +0 -0
  21. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@stdout.cache_meta +0 -0
  22. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@style.cache +0 -0
  23. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@style.cache_inline +0 -0
  24. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@style.cache_meta +0 -0
  25. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@terminal.cache +0 -0
  26. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@terminal.cache_inline +0 -0
  27. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@terminal.cache_meta +0 -0
  28. package/tui/build/dev/javascript/etch/etch/command.mjs +479 -0
  29. package/tui/build/dev/javascript/etch/etch/cursor.mjs +164 -0
  30. package/tui/build/dev/javascript/etch/etch/event.mjs +2399 -0
  31. package/tui/build/dev/javascript/etch/etch/internal/consts.mjs +3 -0
  32. package/tui/build/dev/javascript/etch/etch/stdout.mjs +375 -0
  33. package/tui/build/dev/javascript/etch/etch/style.mjs +741 -0
  34. package/tui/build/dev/javascript/etch/etch/terminal.mjs +137 -0
  35. package/tui/build/dev/javascript/etch/gleam.mjs +1 -0
  36. package/tui/build/dev/javascript/etch/input/event_ffi.erl +73 -0
  37. package/tui/build/dev/javascript/etch/input/input_ffi.mjs +192 -0
  38. package/tui/build/dev/javascript/etch/input/signal_handler.erl +33 -0
  39. package/tui/build/dev/javascript/etch/terminal/terminal_ffi.erl +22 -0
  40. package/tui/build/dev/javascript/etch/terminal/terminal_ffi.mjs +37 -0
  41. package/tui/build/dev/javascript/etch/terminal/tty_state.erl +29 -0
  42. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@application.cache +0 -0
  43. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@application.cache_inline +0 -0
  44. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@application.cache_meta +0 -0
  45. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@atom.cache +0 -0
  46. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@atom.cache_inline +0 -0
  47. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@atom.cache_meta +0 -0
  48. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@charlist.cache +0 -0
  49. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@charlist.cache_inline +0 -0
  50. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@charlist.cache_meta +0 -0
  51. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@node.cache +0 -0
  52. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@node.cache_inline +0 -0
  53. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@node.cache_meta +0 -0
  54. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@port.cache +0 -0
  55. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@port.cache_inline +0 -0
  56. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@port.cache_meta +0 -0
  57. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@process.cache +0 -0
  58. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@process.cache_inline +0 -0
  59. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@process.cache_meta +0 -0
  60. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@reference.cache +0 -0
  61. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@reference.cache_inline +0 -0
  62. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@reference.cache_meta +0 -0
  63. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/application.mjs +38 -0
  64. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/atom.mjs +2 -0
  65. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/charlist.mjs +1 -0
  66. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/node.mjs +12 -0
  67. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/port.mjs +1 -0
  68. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/process.mjs +161 -0
  69. package/tui/build/dev/javascript/gleam_erlang/gleam/erlang/reference.mjs +1 -0
  70. package/tui/build/dev/javascript/gleam_erlang/gleam.mjs +1 -0
  71. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@application.erl +43 -0
  72. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@atom.erl +94 -0
  73. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@charlist.erl +42 -0
  74. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@node.erl +80 -0
  75. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@port.erl +8 -0
  76. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@process.erl +868 -0
  77. package/tui/build/dev/javascript/gleam_erlang/gleam@erlang@reference.erl +21 -0
  78. package/tui/build/dev/javascript/gleam_erlang/gleam_erlang_ffi.erl +164 -0
  79. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@array.cache +0 -0
  80. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@array.cache_inline +0 -0
  81. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@array.cache_meta +0 -0
  82. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@promise.cache +0 -0
  83. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@promise.cache_inline +0 -0
  84. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@promise.cache_meta +0 -0
  85. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@symbol.cache +0 -0
  86. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@symbol.cache_inline +0 -0
  87. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@symbol.cache_meta +0 -0
  88. package/tui/build/dev/javascript/gleam_javascript/gleam/javascript/array.mjs +24 -0
  89. package/tui/build/dev/javascript/gleam_javascript/gleam/javascript/promise.mjs +105 -0
  90. package/tui/build/dev/javascript/gleam_javascript/gleam/javascript/symbol.mjs +7 -0
  91. package/tui/build/dev/javascript/gleam_javascript/gleam.mjs +1 -0
  92. package/tui/build/dev/javascript/gleam_javascript/gleam_javascript_ffi.mjs +133 -0
  93. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache +0 -0
  94. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache_inline +0 -0
  95. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache_meta +0 -0
  96. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache +0 -0
  97. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_inline +0 -0
  98. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_meta +0 -0
  99. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache +0 -0
  100. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache_inline +0 -0
  101. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache_meta +0 -0
  102. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache +0 -0
  103. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache_inline +0 -0
  104. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache_meta +0 -0
  105. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache +0 -0
  106. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache_inline +0 -0
  107. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache_meta +0 -0
  108. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache +0 -0
  109. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_inline +0 -0
  110. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_meta +0 -0
  111. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache +0 -0
  112. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache_inline +0 -0
  113. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache_meta +0 -0
  114. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache +0 -0
  115. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache_inline +0 -0
  116. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache_meta +0 -0
  117. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache +0 -0
  118. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache_inline +0 -0
  119. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache_meta +0 -0
  120. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache +0 -0
  121. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache_inline +0 -0
  122. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache_meta +0 -0
  123. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache +0 -0
  124. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache_inline +0 -0
  125. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache_meta +0 -0
  126. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache +0 -0
  127. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache_inline +0 -0
  128. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache_meta +0 -0
  129. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache +0 -0
  130. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache_inline +0 -0
  131. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache_meta +0 -0
  132. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache +0 -0
  133. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache_inline +0 -0
  134. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache_meta +0 -0
  135. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache +0 -0
  136. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_inline +0 -0
  137. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_meta +0 -0
  138. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache +0 -0
  139. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache_inline +0 -0
  140. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache_meta +0 -0
  141. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache +0 -0
  142. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_inline +0 -0
  143. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_meta +0 -0
  144. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache +0 -0
  145. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache_inline +0 -0
  146. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache_meta +0 -0
  147. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache +0 -0
  148. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache_inline +0 -0
  149. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache_meta +0 -0
  150. package/tui/build/dev/javascript/gleam_stdlib/dict.mjs +710 -0
  151. package/tui/build/dev/javascript/gleam_stdlib/gleam/bit_array.mjs +286 -0
  152. package/tui/build/dev/javascript/gleam_stdlib/gleam/bool.mjs +295 -0
  153. package/tui/build/dev/javascript/gleam_stdlib/gleam/bytes_tree.mjs +225 -0
  154. package/tui/build/dev/javascript/gleam_stdlib/gleam/dict.mjs +455 -0
  155. package/tui/build/dev/javascript/gleam_stdlib/gleam/dynamic/decode.mjs +993 -0
  156. package/tui/build/dev/javascript/gleam_stdlib/gleam/dynamic.mjs +35 -0
  157. package/tui/build/dev/javascript/gleam_stdlib/gleam/float.mjs +528 -0
  158. package/tui/build/dev/javascript/gleam_stdlib/gleam/function.mjs +6 -0
  159. package/tui/build/dev/javascript/gleam_stdlib/gleam/int.mjs +764 -0
  160. package/tui/build/dev/javascript/gleam_stdlib/gleam/io.mjs +8 -0
  161. package/tui/build/dev/javascript/gleam_stdlib/gleam/list.mjs +3063 -0
  162. package/tui/build/dev/javascript/gleam_stdlib/gleam/option.mjs +386 -0
  163. package/tui/build/dev/javascript/gleam_stdlib/gleam/order.mjs +166 -0
  164. package/tui/build/dev/javascript/gleam_stdlib/gleam/pair.mjs +96 -0
  165. package/tui/build/dev/javascript/gleam_stdlib/gleam/result.mjs +448 -0
  166. package/tui/build/dev/javascript/gleam_stdlib/gleam/set.mjs +413 -0
  167. package/tui/build/dev/javascript/gleam_stdlib/gleam/string.mjs +695 -0
  168. package/tui/build/dev/javascript/gleam_stdlib/gleam/string_tree.mjs +128 -0
  169. package/tui/build/dev/javascript/gleam_stdlib/gleam/uri.mjs +1151 -0
  170. package/tui/build/dev/javascript/gleam_stdlib/gleam.mjs +1 -0
  171. package/tui/build/dev/javascript/gleam_stdlib/gleam@bit_array.erl +347 -0
  172. package/tui/build/dev/javascript/gleam_stdlib/gleam@bool.erl +334 -0
  173. package/tui/build/dev/javascript/gleam_stdlib/gleam@bytes_tree.erl +211 -0
  174. package/tui/build/dev/javascript/gleam_stdlib/gleam@dict.erl +513 -0
  175. package/tui/build/dev/javascript/gleam_stdlib/gleam@dynamic.erl +105 -0
  176. package/tui/build/dev/javascript/gleam_stdlib/gleam@dynamic@decode.erl +1114 -0
  177. package/tui/build/dev/javascript/gleam_stdlib/gleam@float.erl +711 -0
  178. package/tui/build/dev/javascript/gleam_stdlib/gleam@function.erl +18 -0
  179. package/tui/build/dev/javascript/gleam_stdlib/gleam@int.erl +972 -0
  180. package/tui/build/dev/javascript/gleam_stdlib/gleam@io.erl +76 -0
  181. package/tui/build/dev/javascript/gleam_stdlib/gleam@list.erl +2735 -0
  182. package/tui/build/dev/javascript/gleam_stdlib/gleam@option.erl +381 -0
  183. package/tui/build/dev/javascript/gleam_stdlib/gleam@order.erl +188 -0
  184. package/tui/build/dev/javascript/gleam_stdlib/gleam@pair.erl +104 -0
  185. package/tui/build/dev/javascript/gleam_stdlib/gleam@result.erl +500 -0
  186. package/tui/build/dev/javascript/gleam_stdlib/gleam@set.erl +430 -0
  187. package/tui/build/dev/javascript/gleam_stdlib/gleam@string.erl +964 -0
  188. package/tui/build/dev/javascript/gleam_stdlib/gleam@string_tree.erl +202 -0
  189. package/tui/build/dev/javascript/gleam_stdlib/gleam@uri.erl +1042 -0
  190. package/tui/build/dev/javascript/gleam_stdlib/gleam_stdlib.erl +534 -0
  191. package/tui/build/dev/javascript/gleam_stdlib/gleam_stdlib.mjs +1133 -0
  192. package/tui/build/dev/javascript/gleam_version +1 -0
  193. package/tui/build/dev/javascript/prelude.mjs +1575 -0
  194. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui.cache +0 -0
  195. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui.cache_inline +0 -0
  196. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui.cache_meta +0 -0
  197. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui.cache_warnings +0 -0
  198. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui@prompt.cache +0 -0
  199. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui@prompt.cache_inline +0 -0
  200. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui@prompt.cache_meta +0 -0
  201. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui@prompt.cache_warnings +0 -0
  202. package/tui/build/dev/javascript/tui/gleam.mjs +1 -0
  203. package/tui/build/dev/javascript/tui/tui/prompt.mjs +521 -0
  204. package/tui/build/dev/javascript/tui/tui.mjs +334 -0
  205. package/tui/build/dev/javascript/tui/tui_ffi.mjs +32 -0
@@ -0,0 +1,534 @@
1
+ -module(gleam_stdlib).
2
+
3
+ -export([
4
+ map_get/2, iodata_append/2, identity/1, parse_int/1, parse_float/1,
5
+ less_than/2, string_pop_grapheme/1, string_pop_codeunit/1,
6
+ string_starts_with/2, wrap_list/1, string_ends_with/2, string_pad/4,
7
+ uri_parse/1, bit_array_slice/3, percent_encode/1, percent_decode/1,
8
+ base64_decode/1, parse_query/1, bit_array_concat/1,
9
+ base64_encode/2, tuple_get/2, classify_dynamic/1, print/1,
10
+ println/1, print_error/1, println_error/1, inspect/1, float_to_string/1,
11
+ int_from_base_string/2, utf_codepoint_list_to_string/1, contains_string/2,
12
+ crop_string/2, base16_encode/1, base16_decode/1, string_replace/3, slice/3,
13
+ bit_array_to_int_and_size/1, bit_array_pad_to_bytes/1, index/2, list/5,
14
+ dict/1, int/1, float/1, bit_array/1, is_null/1
15
+ ]).
16
+
17
+ %% Taken from OTP's uri_string module
18
+ -define(DEC2HEX(X),
19
+ if ((X) >= 0) andalso ((X) =< 9) -> (X) + $0;
20
+ ((X) >= 10) andalso ((X) =< 15) -> (X) + $A - 10
21
+ end).
22
+
23
+ %% Taken from OTP's uri_string module
24
+ -define(HEX2DEC(X),
25
+ if ((X) >= $0) andalso ((X) =< $9) -> (X) - $0;
26
+ ((X) >= $A) andalso ((X) =< $F) -> (X) - $A + 10;
27
+ ((X) >= $a) andalso ((X) =< $f) -> (X) - $a + 10
28
+ end).
29
+
30
+ -define(is_lowercase_char(X),
31
+ (X > 96 andalso X < 123)).
32
+ -define(is_underscore_char(X),
33
+ (X == 95)).
34
+ -define(is_digit_char(X),
35
+ (X > 47 andalso X < 58)).
36
+ -define(is_ascii_character(X),
37
+ (erlang:is_integer(X) andalso X >= 32 andalso X =< 126)).
38
+
39
+ uppercase(X) -> X - 32.
40
+
41
+ map_get(Map, Key) ->
42
+ case maps:find(Key, Map) of
43
+ error -> {error, nil};
44
+ OkFound -> OkFound
45
+ end.
46
+
47
+ iodata_append(Iodata, String) -> [Iodata, String].
48
+
49
+ identity(X) -> X.
50
+
51
+ classify_dynamic(nil) -> <<"Nil">>;
52
+ classify_dynamic(null) -> <<"Nil">>;
53
+ classify_dynamic(undefined) -> <<"Nil">>;
54
+ classify_dynamic(X) when is_boolean(X) -> <<"Bool">>;
55
+ classify_dynamic(X) when is_atom(X) -> <<"Atom">>;
56
+ classify_dynamic(X) when is_binary(X) -> <<"String">>;
57
+ classify_dynamic(X) when is_bitstring(X) -> <<"BitArray">>;
58
+ classify_dynamic(X) when is_integer(X) -> <<"Int">>;
59
+ classify_dynamic(X) when is_float(X) -> <<"Float">>;
60
+ classify_dynamic(X) when is_list(X) -> <<"List">>;
61
+ classify_dynamic(X) when is_map(X) -> <<"Dict">>;
62
+ classify_dynamic(X) when is_tuple(X) -> <<"Array">>;
63
+ classify_dynamic(X) when is_reference(X) -> <<"Reference">>;
64
+ classify_dynamic(X) when is_pid(X) -> <<"Pid">>;
65
+ classify_dynamic(X) when is_port(X) -> <<"Port">>;
66
+ classify_dynamic(X) when is_function(X) -> <<"Function">>;
67
+ classify_dynamic(_) -> <<"Unknown">>.
68
+
69
+ tuple_get(_tup, Index) when Index < 0 -> {error, nil};
70
+ tuple_get(Data, Index) when Index >= tuple_size(Data) -> {error, nil};
71
+ tuple_get(Data, Index) -> {ok, element(Index + 1, Data)}.
72
+
73
+ int_from_base_string(String, Base) ->
74
+ case catch binary_to_integer(String, Base) of
75
+ Int when is_integer(Int) -> {ok, Int};
76
+ _ -> {error, nil}
77
+ end.
78
+
79
+ parse_int(String) ->
80
+ case catch binary_to_integer(String) of
81
+ Int when is_integer(Int) -> {ok, Int};
82
+ _ -> {error, nil}
83
+ end.
84
+
85
+ parse_float(String) ->
86
+ case catch binary_to_float(String) of
87
+ Float when is_float(Float) -> {ok, Float};
88
+ _ -> {error, nil}
89
+ end.
90
+
91
+ less_than(Lhs, Rhs) ->
92
+ Lhs < Rhs.
93
+
94
+ string_starts_with(_, <<>>) -> true;
95
+ string_starts_with(String, Prefix) when byte_size(Prefix) > byte_size(String) -> false;
96
+ string_starts_with(String, Prefix) ->
97
+ PrefixSize = byte_size(Prefix),
98
+ Prefix == binary_part(String, 0, PrefixSize).
99
+
100
+ string_ends_with(_, <<>>) -> true;
101
+ string_ends_with(String, Suffix) when byte_size(Suffix) > byte_size(String) -> false;
102
+ string_ends_with(String, Suffix) ->
103
+ SuffixSize = byte_size(Suffix),
104
+ Suffix == binary_part(String, byte_size(String) - SuffixSize, SuffixSize).
105
+
106
+ string_pad(String, Length, Dir, PadString) ->
107
+ Chars = string:pad(String, Length, Dir, binary_to_list(PadString)),
108
+ case unicode:characters_to_binary(Chars) of
109
+ Bin when is_binary(Bin) -> Bin;
110
+ Error -> erlang:error({gleam_error, {string_invalid_utf8, Error}})
111
+ end.
112
+
113
+ string_pop_grapheme(String) ->
114
+ case string:next_grapheme(String) of
115
+ [ Next | Rest ] when is_binary(Rest) ->
116
+ {ok, {unicode:characters_to_binary([Next]), Rest}};
117
+
118
+ [ Next | Rest ] ->
119
+ {ok, {unicode:characters_to_binary([Next]), unicode:characters_to_binary(Rest)}};
120
+
121
+ _ -> {error, nil}
122
+ end.
123
+
124
+ string_pop_codeunit(<<Cp/integer, Rest/binary>>) -> {Cp, Rest};
125
+ string_pop_codeunit(Binary) -> {0, Binary}.
126
+
127
+ bit_array_pad_to_bytes(Bin) ->
128
+ case erlang:bit_size(Bin) rem 8 of
129
+ 0 -> Bin;
130
+ TrailingBits ->
131
+ PaddingBits = 8 - TrailingBits,
132
+ <<Bin/bits, 0:PaddingBits>>
133
+ end.
134
+
135
+ bit_array_concat(BitArrays) ->
136
+ list_to_bitstring(BitArrays).
137
+
138
+ -if(?OTP_RELEASE >= 26).
139
+ base64_encode(Bin, Padding) ->
140
+ PaddedBin = bit_array_pad_to_bytes(Bin),
141
+ base64:encode(PaddedBin, #{padding => Padding}).
142
+ -else.
143
+ base64_encode(_Bin, _Padding) ->
144
+ erlang:error(<<"Erlang OTP/26 or higher is required to use base64:encode">>).
145
+ -endif.
146
+
147
+ bit_array_slice(Bin, Pos, Len) ->
148
+ try {ok, binary:part(Bin, Pos, Len)}
149
+ catch error:badarg -> {error, nil}
150
+ end.
151
+
152
+ base64_decode(S) ->
153
+ try {ok, base64:decode(S)}
154
+ catch error:_ -> {error, nil}
155
+ end.
156
+
157
+ wrap_list(X) when is_list(X) -> X;
158
+ wrap_list(X) -> [X].
159
+
160
+ parse_query(Query) ->
161
+ case uri_string:dissect_query(Query) of
162
+ {error, _, _} -> {error, nil};
163
+ Pairs ->
164
+ Pairs1 = lists:map(fun
165
+ ({K, true}) -> {K, <<"">>};
166
+ (Pair) -> Pair
167
+ end, Pairs),
168
+ {ok, Pairs1}
169
+ end.
170
+
171
+ percent_encode(B) -> percent_encode(B, <<>>).
172
+ percent_encode(<<>>, Acc) ->
173
+ Acc;
174
+ percent_encode(<<H,T/binary>>, Acc) ->
175
+ case percent_ok(H) of
176
+ true ->
177
+ percent_encode(T, <<Acc/binary,H>>);
178
+ false ->
179
+ <<A:4,B:4>> = <<H>>,
180
+ percent_encode(T, <<Acc/binary,$%,(?DEC2HEX(A)),(?DEC2HEX(B))>>)
181
+ end.
182
+
183
+ percent_decode(Cs) -> percent_decode(Cs, <<>>).
184
+ percent_decode(<<$%, C0, C1, Cs/binary>>, Acc) ->
185
+ case is_hex_digit(C0) andalso is_hex_digit(C1) of
186
+ true ->
187
+ B = ?HEX2DEC(C0)*16+?HEX2DEC(C1),
188
+ percent_decode(Cs, <<Acc/binary, B>>);
189
+ false ->
190
+ {error, nil}
191
+ end;
192
+ percent_decode(<<C,Cs/binary>>, Acc) ->
193
+ percent_decode(Cs, <<Acc/binary, C>>);
194
+ percent_decode(<<>>, Acc) ->
195
+ check_utf8(Acc).
196
+
197
+ percent_ok($!) -> true;
198
+ percent_ok($$) -> true;
199
+ percent_ok($') -> true;
200
+ percent_ok($() -> true;
201
+ percent_ok($)) -> true;
202
+ percent_ok($*) -> true;
203
+ percent_ok($+) -> true;
204
+ percent_ok($-) -> true;
205
+ percent_ok($.) -> true;
206
+ percent_ok($_) -> true;
207
+ percent_ok($~) -> true;
208
+ percent_ok(C) when $0 =< C, C =< $9 -> true;
209
+ percent_ok(C) when $A =< C, C =< $Z -> true;
210
+ percent_ok(C) when $a =< C, C =< $z -> true;
211
+ percent_ok(_) -> false.
212
+
213
+ is_hex_digit(C) ->
214
+ ($0 =< C andalso C =< $9) orelse ($a =< C andalso C =< $f) orelse ($A =< C andalso C =< $F).
215
+
216
+ check_utf8(Cs) ->
217
+ case unicode:characters_to_list(Cs) of
218
+ {incomplete, _, _} -> {error, nil};
219
+ {error, _, _} -> {error, nil};
220
+ _ -> {ok, Cs}
221
+ end.
222
+
223
+ uri_parse(String) ->
224
+ case uri_string:parse(String) of
225
+ {error, _, _} -> {error, nil};
226
+ Uri ->
227
+ Port =
228
+ try maps:get(port, Uri) of
229
+ undefined -> none;
230
+ Value -> {some, Value}
231
+ catch _:_ -> none
232
+ end,
233
+ {ok, {uri,
234
+ maps_get_optional_lowercase(Uri, scheme),
235
+ maps_get_optional(Uri, userinfo),
236
+ maps_get_optional(Uri, host),
237
+ Port,
238
+ maps_get_or(Uri, path, <<>>),
239
+ maps_get_optional(Uri, query),
240
+ maps_get_optional(Uri, fragment)
241
+ }}
242
+ end.
243
+
244
+ maps_get_optional_lowercase(Map, Key) ->
245
+ try {some, string:lowercase(maps:get(Key, Map))}
246
+ catch _:_ -> none
247
+ end.
248
+
249
+ maps_get_optional(Map, Key) ->
250
+ try {some, maps:get(Key, Map)}
251
+ catch _:_ -> none
252
+ end.
253
+
254
+ maps_get_or(Map, Key, Default) ->
255
+ try maps:get(Key, Map)
256
+ catch _:_ -> Default
257
+ end.
258
+
259
+ print(String) ->
260
+ io:put_chars(String),
261
+ nil.
262
+
263
+ println(String) ->
264
+ io:put_chars([String, $\n]),
265
+ nil.
266
+
267
+ print_error(String) ->
268
+ io:put_chars(standard_error, String),
269
+ nil.
270
+
271
+ println_error(String) ->
272
+ io:put_chars(standard_error, [String, $\n]),
273
+ nil.
274
+
275
+ inspect(true) ->
276
+ "True";
277
+ inspect(false) ->
278
+ "False";
279
+ inspect(nil) ->
280
+ "Nil";
281
+ inspect(Data) when is_map(Data) ->
282
+ Fields = [
283
+ [<<"#(">>, inspect(Key), <<", ">>, inspect(Value), <<")">>]
284
+ || {Key, Value} <- maps:to_list(Data)
285
+ ],
286
+ ["dict.from_list([", lists:join(", ", Fields), "])"];
287
+ inspect(Atom) when is_atom(Atom) ->
288
+ erlang:element(2, inspect_atom(Atom));
289
+ inspect(Any) when is_integer(Any) ->
290
+ erlang:integer_to_list(Any);
291
+ inspect(Any) when is_float(Any) ->
292
+ io_lib_format:fwrite_g(Any);
293
+ inspect(Binary) when is_binary(Binary) ->
294
+ case inspect_maybe_utf8_string(Binary, <<>>) of
295
+ {ok, InspectedUtf8String} -> InspectedUtf8String;
296
+ {error, not_a_utf8_string} ->
297
+ Segments = [erlang:integer_to_list(X) || <<X>> <= Binary],
298
+ ["<<", lists:join(", ", Segments), ">>"]
299
+ end;
300
+ inspect(Bits) when is_bitstring(Bits) ->
301
+ inspect_bit_array(Bits);
302
+ inspect(List) when is_list(List) ->
303
+ case inspect_list(List, true) of
304
+ {charlist, _} -> ["charlist.from_string(\"", list_to_binary(List), "\")"];
305
+ {proper, Elements} -> ["[", Elements, "]"];
306
+ {improper, Elements} -> ["//erl([", Elements, "])"]
307
+ end;
308
+ inspect(Any) when is_tuple(Any) % Record constructors
309
+ andalso is_atom(element(1, Any))
310
+ andalso element(1, Any) =/= false
311
+ andalso element(1, Any) =/= true
312
+ andalso element(1, Any) =/= nil
313
+ ->
314
+ [Atom | ArgsList] = erlang:tuple_to_list(Any),
315
+ InspectedArgs = lists:map(fun inspect/1, ArgsList),
316
+ case inspect_atom(Atom) of
317
+ {gleam_atom, GleamAtom} ->
318
+ Args = lists:join(<<", ">>, InspectedArgs),
319
+ [GleamAtom, "(", Args, ")"];
320
+ {erlang_atom, ErlangAtom} ->
321
+ Args = lists:join(<<", ">>, [ErlangAtom | InspectedArgs]),
322
+ ["#(", Args, ")"]
323
+ end;
324
+ inspect(Tuple) when is_tuple(Tuple) ->
325
+ Elements = lists:map(fun inspect/1, erlang:tuple_to_list(Tuple)),
326
+ ["#(", lists:join(", ", Elements), ")"];
327
+ inspect(Any) when is_function(Any) ->
328
+ {arity, Arity} = erlang:fun_info(Any, arity),
329
+ ArgsAsciiCodes = lists:seq($a, $a + Arity - 1),
330
+ Args = lists:join(<<", ">>,
331
+ lists:map(fun(Arg) -> <<Arg>> end, ArgsAsciiCodes)
332
+ ),
333
+ ["//fn(", Args, ") { ... }"];
334
+ inspect(Any) ->
335
+ ["//erl(", io_lib:format("~p", [Any]), ")"].
336
+
337
+ inspect_atom(Atom) ->
338
+ Binary = erlang:atom_to_binary(Atom),
339
+ case inspect_maybe_gleam_atom(Binary, none, <<>>) of
340
+ {ok, Inspected} -> {gleam_atom, Inspected};
341
+ {error, _} -> {erlang_atom, ["atom.create(\"", Binary, "\")"]}
342
+ end.
343
+
344
+ inspect_maybe_gleam_atom(<<>>, none, _) ->
345
+ {error, nil};
346
+ inspect_maybe_gleam_atom(<<First, _Rest/binary>>, none, _) when ?is_digit_char(First) ->
347
+ {error, nil};
348
+ inspect_maybe_gleam_atom(<<"_", _Rest/binary>>, none, _) ->
349
+ {error, nil};
350
+ inspect_maybe_gleam_atom(<<"_">>, _PrevChar, _Acc) ->
351
+ {error, nil};
352
+ inspect_maybe_gleam_atom(<<"_", _Rest/binary>>, $_, _Acc) ->
353
+ {error, nil};
354
+ inspect_maybe_gleam_atom(<<First, _Rest/binary>>, _PrevChar, _Acc)
355
+ when not (?is_lowercase_char(First) orelse ?is_underscore_char(First) orelse ?is_digit_char(First)) ->
356
+ {error, nil};
357
+ inspect_maybe_gleam_atom(<<First, Rest/binary>>, none, Acc) ->
358
+ inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, (uppercase(First))>>);
359
+ inspect_maybe_gleam_atom(<<"_", Rest/binary>>, _PrevChar, Acc) ->
360
+ inspect_maybe_gleam_atom(Rest, $_, Acc);
361
+ inspect_maybe_gleam_atom(<<First, Rest/binary>>, $_, Acc) ->
362
+ inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, (uppercase(First))>>);
363
+ inspect_maybe_gleam_atom(<<First, Rest/binary>>, _PrevChar, Acc) ->
364
+ inspect_maybe_gleam_atom(Rest, First, <<Acc/binary, First>>);
365
+ inspect_maybe_gleam_atom(<<>>, _PrevChar, Acc) ->
366
+ {ok, Acc};
367
+ inspect_maybe_gleam_atom(A, B, C) ->
368
+ erlang:display({A, B, C}),
369
+ throw({gleam_error, A, B, C}).
370
+
371
+ inspect_list([], _) ->
372
+ {proper, []};
373
+ inspect_list([First], true) when ?is_ascii_character(First) ->
374
+ {charlist, nil};
375
+ inspect_list([First], _) ->
376
+ {proper, [inspect(First)]};
377
+ inspect_list([First | Rest], ValidCharlist) when is_list(Rest) ->
378
+ StillValidCharlist = ValidCharlist andalso ?is_ascii_character(First),
379
+ {Kind, Inspected} = inspect_list(Rest, StillValidCharlist),
380
+ {Kind, [inspect(First), <<", ">> | Inspected]};
381
+ inspect_list([First | ImproperTail], _) ->
382
+ {improper, [inspect(First), <<" | ">>, inspect(ImproperTail)]}.
383
+
384
+ inspect_bit_array(Bits) ->
385
+ Text = inspect_bit_array(Bits, <<"<<">>),
386
+ <<Text/binary, ">>">>.
387
+
388
+ inspect_bit_array(<<>>, Acc) ->
389
+ Acc;
390
+ inspect_bit_array(<<X, Rest/bitstring>>, Acc) ->
391
+ inspect_bit_array(Rest, append_segment(Acc, erlang:integer_to_binary(X)));
392
+ inspect_bit_array(Rest, Acc) ->
393
+ Size = bit_size(Rest),
394
+ <<X:Size>> = Rest,
395
+ X1 = erlang:integer_to_binary(X),
396
+ Size1 = erlang:integer_to_binary(Size),
397
+ Segment = <<X1/binary, ":size(", Size1/binary, ")">>,
398
+ inspect_bit_array(<<>>, append_segment(Acc, Segment)).
399
+
400
+ bit_array_to_int_and_size(A) ->
401
+ Size = bit_size(A),
402
+ <<A1:Size>> = A,
403
+ {A1, Size}.
404
+
405
+ append_segment(<<"<<">>, Segment) ->
406
+ <<"<<", Segment/binary>>;
407
+ append_segment(Acc, Segment) ->
408
+ <<Acc/binary, ", ", Segment/binary>>.
409
+
410
+
411
+ inspect_maybe_utf8_string(Binary, Acc) ->
412
+ case Binary of
413
+ <<>> -> {ok, <<$", Acc/binary, $">>};
414
+ <<First/utf8, Rest/binary>> ->
415
+ Escaped = case First of
416
+ $" -> <<$\\, $">>;
417
+ $\\ -> <<$\\, $\\>>;
418
+ $\r -> <<$\\, $r>>;
419
+ $\n -> <<$\\, $n>>;
420
+ $\t -> <<$\\, $t>>;
421
+ $\f -> <<$\\, $f>>;
422
+ X when X > 126, X < 160 -> convert_to_u(X);
423
+ X when X < 32 -> convert_to_u(X);
424
+ Other -> <<Other/utf8>>
425
+ end,
426
+ inspect_maybe_utf8_string(Rest, <<Acc/binary, Escaped/binary>>);
427
+ _ -> {error, not_a_utf8_string}
428
+ end.
429
+
430
+ convert_to_u(Code) ->
431
+ list_to_binary(io_lib:format("\\u{~4.16.0B}", [Code])).
432
+
433
+ float_to_string(Float) when is_float(Float) ->
434
+ erlang:iolist_to_binary(io_lib_format:fwrite_g(Float)).
435
+
436
+ utf_codepoint_list_to_string(List) ->
437
+ case unicode:characters_to_binary(List) of
438
+ {error, _} -> erlang:error({gleam_error, {string_invalid_utf8, List}});
439
+ Binary -> Binary
440
+ end.
441
+
442
+ crop_string(String, Prefix) ->
443
+ case string:find(String, Prefix) of
444
+ nomatch -> String;
445
+ New -> New
446
+ end.
447
+
448
+ contains_string(String, Substring) ->
449
+ is_bitstring(string:find(String, Substring)).
450
+
451
+ base16_encode(Bin) ->
452
+ PaddedBin = bit_array_pad_to_bytes(Bin),
453
+ binary:encode_hex(PaddedBin).
454
+
455
+ base16_decode(String) ->
456
+ try
457
+ {ok, binary:decode_hex(String)}
458
+ catch
459
+ _:_ -> {error, nil}
460
+ end.
461
+
462
+ string_replace(String, Pattern, Replacement) ->
463
+ string:replace(String, Pattern, Replacement, all).
464
+
465
+ slice(String, Index, Length) ->
466
+ case string:slice(String, Index, Length) of
467
+ X when is_binary(X) -> X;
468
+ X when is_list(X) -> unicode:characters_to_binary(X)
469
+ end.
470
+
471
+ index([X | _], 0) ->
472
+ {ok, {some, X}};
473
+ index([_, X | _], 1) ->
474
+ {ok, {some, X}};
475
+ index([_, _, X | _], 2) ->
476
+ {ok, {some, X}};
477
+ index([_, _, _, X | _], 3) ->
478
+ {ok, {some, X}};
479
+ index([_, _, _, _, X | _], 4) ->
480
+ {ok, {some, X}};
481
+ index([_, _, _, _, _, X | _], 5) ->
482
+ {ok, {some, X}};
483
+ index([_, _, _, _, _, _, X | _], 6) ->
484
+ {ok, {some, X}};
485
+ index([_, _, _, _, _, _, _, X | _], 7) ->
486
+ {ok, {some, X}};
487
+ index(Tuple, Index) when is_tuple(Tuple) andalso is_integer(Index) ->
488
+ {ok, try
489
+ {some, element(Index + 1, Tuple)}
490
+ catch _:_ ->
491
+ none
492
+ end};
493
+ index(Map, Key) when is_map(Map) ->
494
+ {ok, try
495
+ {some, maps:get(Key, Map)}
496
+ catch _:_ ->
497
+ none
498
+ end};
499
+ index(_, Index) when is_integer(Index) ->
500
+ {error, <<"Indexable">>};
501
+ index(_, _) ->
502
+ {error, <<"Dict">>}.
503
+
504
+ list(T, A, B, C, D) when is_tuple(T) ->
505
+ list(tuple_to_list(T), A, B, C, D);
506
+ list([], _, _, _, Acc) ->
507
+ {lists:reverse(Acc), []};
508
+ list([X | Xs], Decode, PushPath, Index, Acc) ->
509
+ {Out, Errors} = Decode(X),
510
+ case Errors of
511
+ [] -> list(Xs, Decode, PushPath, Index + 1, [Out | Acc]);
512
+ _ -> PushPath({[], Errors}, integer_to_binary(Index))
513
+ end;
514
+ list(Unexpected, _, _, _, []) ->
515
+ Found = gleam@dynamic:classify(Unexpected),
516
+ Error = {decode_error, <<"List"/utf8>>, Found, []},
517
+ {[], [Error]};
518
+ list(_, _, _, _, Acc) ->
519
+ {lists:reverse(Acc), []}.
520
+
521
+ dict(#{} = Data) -> {ok, Data};
522
+ dict(_) -> {error, nil}.
523
+
524
+ int(I) when is_integer(I) -> {ok, I};
525
+ int(_) -> {error, 0}.
526
+
527
+ float(F) when is_float(F) -> {ok, F};
528
+ float(_) -> {error, 0.0}.
529
+
530
+ bit_array(B) when is_bitstring(B) -> {ok, B};
531
+ bit_array(_) -> {error, <<>>}.
532
+
533
+ is_null(X) ->
534
+ X =:= undefined orelse X =:= null orelse X =:= nil.