mt-lang 0.2.0 → 0.2.1

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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/docs/index.html +4 -3
  3. data/lib/milk_tea/base.rb +1 -1
  4. data/std/asset_pack.mt +267 -0
  5. data/std/async/libuv_runtime.mt +539 -0
  6. data/std/async/mailbox.mt +191 -0
  7. data/std/async/runtime.mt +87 -0
  8. data/std/async.mt +87 -0
  9. data/std/base64.mt +185 -0
  10. data/std/behavior_tree.mt +396 -0
  11. data/std/binary.mt +314 -0
  12. data/std/binary_heap.mt +157 -0
  13. data/std/bitset.mt +239 -0
  14. data/std/box2d.mt +535 -0
  15. data/std/bytes.mt +46 -0
  16. data/std/c/box2d.mt +1254 -0
  17. data/std/c/cgltf.mt +647 -0
  18. data/std/c/cjson.mt +106 -0
  19. data/std/c/crypto.mt +11 -0
  20. data/std/c/crypto_support.h +51 -0
  21. data/std/c/ctype.mt +19 -0
  22. data/std/c/ctype_bindgen.h +29 -0
  23. data/std/c/curl.mt +1223 -0
  24. data/std/c/enet.mt +473 -0
  25. data/std/c/errno.mt +41 -0
  26. data/std/c/errno_bindgen.h +53 -0
  27. data/std/c/flecs.mt +2945 -0
  28. data/std/c/fs.linux.mt +43 -0
  29. data/std/c/fs.windows.mt +43 -0
  30. data/std/c/fs_support.h +954 -0
  31. data/std/c/gl.mt +2065 -0
  32. data/std/c/gl_registry_helpers.h +10748 -0
  33. data/std/c/glfw.mt +499 -0
  34. data/std/c/libc.mt +167 -0
  35. data/std/c/libuv.mt +1491 -0
  36. data/std/c/math.mt +22 -0
  37. data/std/c/math_bindgen.h +31 -0
  38. data/std/c/miniaudio.mt +3420 -0
  39. data/std/c/pcre2.mt +735 -0
  40. data/std/c/process.mt +58 -0
  41. data/std/c/process_support.h +1147 -0
  42. data/std/c/raygui.mt +1602 -0
  43. data/std/c/raylib.mt +1245 -0
  44. data/std/c/raymath.mt +163 -0
  45. data/std/c/rlgl.mt +434 -0
  46. data/std/c/rpng.mt +60 -0
  47. data/std/c/rres.mt +187 -0
  48. data/std/c/sdl3.mt +4132 -0
  49. data/std/c/sqlite3.mt +951 -0
  50. data/std/c/stb_image.mt +52 -0
  51. data/std/c/stb_image_resize2.mt +128 -0
  52. data/std/c/stb_image_write.mt +19 -0
  53. data/std/c/stb_rect_pack.mt +38 -0
  54. data/std/c/stb_truetype.mt +175 -0
  55. data/std/c/stb_vorbis.mt +31 -0
  56. data/std/c/stdio.mt +90 -0
  57. data/std/c/steamworks.h +5769 -0
  58. data/std/c/steamworks.mt +4771 -0
  59. data/std/c/string.mt +16 -0
  60. data/std/c/string_bindgen.h +36 -0
  61. data/std/c/sync.mt +33 -0
  62. data/std/c/sync_support.h +219 -0
  63. data/std/c/terminal.mt +24 -0
  64. data/std/c/terminal_support.h +408 -0
  65. data/std/c/time.mt +26 -0
  66. data/std/c/tls.mt +24 -0
  67. data/std/c/tls_support.h +626 -0
  68. data/std/c/tracy.mt +53 -0
  69. data/std/c/zlib.mt +20 -0
  70. data/std/c/zlib_support.h +239 -0
  71. data/std/c/zstd.mt +231 -0
  72. data/std/cell.mt +60 -0
  73. data/std/cgltf.mt +115 -0
  74. data/std/cjson.mt +90 -0
  75. data/std/cli.mt +768 -0
  76. data/std/cookie.mt +198 -0
  77. data/std/counter.mt +160 -0
  78. data/std/crypto.mt +74 -0
  79. data/std/cstring.mt +13 -0
  80. data/std/ctype.mt +52 -0
  81. data/std/curl/runtime.mt +261 -0
  82. data/std/curl.mt +38 -0
  83. data/std/deque.mt +348 -0
  84. data/std/encoding.mt +93 -0
  85. data/std/enet.mt +133 -0
  86. data/std/env.mt +41 -0
  87. data/std/errno.mt +47 -0
  88. data/std/flecs.mt +978 -0
  89. data/std/fmt.mt +271 -0
  90. data/std/fs.linux.mt +696 -0
  91. data/std/fs.windows.mt +711 -0
  92. data/std/fsm.mt +267 -0
  93. data/std/gl.mt +2062 -0
  94. data/std/glfw.mt +471 -0
  95. data/std/goap.mt +342 -0
  96. data/std/graph.mt +521 -0
  97. data/std/gzip.mt +77 -0
  98. data/std/hash.mt +429 -0
  99. data/std/http/server.mt +810 -0
  100. data/std/http.mt +1227 -0
  101. data/std/intern.mt +53 -0
  102. data/std/jobs.mt +288 -0
  103. data/std/json.mt +627 -0
  104. data/std/libc.mt +34 -0
  105. data/std/libuv.mt +554 -0
  106. data/std/linear_algebra.mt +243 -0
  107. data/std/linked_map.mt +372 -0
  108. data/std/linked_map_view.mt +49 -0
  109. data/std/linked_set.mt +117 -0
  110. data/std/log.mt +69 -0
  111. data/std/map.mt +418 -0
  112. data/std/math.mt +24 -0
  113. data/std/mem/arena.mt +137 -0
  114. data/std/mem/endian.mt +51 -0
  115. data/std/mem/heap.mt +298 -0
  116. data/std/mem/pool.mt +164 -0
  117. data/std/mem/stack.mt +47 -0
  118. data/std/mem/tracking.mt +119 -0
  119. data/std/miniaudio.mt +1299 -0
  120. data/std/multiset.mt +191 -0
  121. data/std/net/channel.mt +727 -0
  122. data/std/net/clock.mt +237 -0
  123. data/std/net/discovery.mt +277 -0
  124. data/std/net/lobby.mt +813 -0
  125. data/std/net/manager.mt +539 -0
  126. data/std/net/mux.mt +839 -0
  127. data/std/net/nat.mt +122 -0
  128. data/std/net/packet.mt +219 -0
  129. data/std/net/punch.mt +162 -0
  130. data/std/net/rpc.mt +119 -0
  131. data/std/net/session.mt +1157 -0
  132. data/std/net/stun.mt +252 -0
  133. data/std/net/sync.mt +183 -0
  134. data/std/net/turn.mt +459 -0
  135. data/std/net.mt +2944 -0
  136. data/std/oauth2.mt +408 -0
  137. data/std/option.mt +51 -0
  138. data/std/ordered_map.mt +497 -0
  139. data/std/ordered_set.mt +348 -0
  140. data/std/path.mt +368 -0
  141. data/std/pcre2/runtime.mt +35 -0
  142. data/std/pcre2.mt +78 -0
  143. data/std/priority_queue.mt +55 -0
  144. data/std/process.mt +837 -0
  145. data/std/queue.mt +55 -0
  146. data/std/random.mt +146 -0
  147. data/std/raygui.mt +99 -0
  148. data/std/raylib/debug_console.mt +71 -0
  149. data/std/raylib/easing.mt +388 -0
  150. data/std/raylib/packed_assets.mt +255 -0
  151. data/std/raylib/runtime.mt +30 -0
  152. data/std/raylib/tracy_gpu.mt +37 -0
  153. data/std/raylib.mt +1510 -0
  154. data/std/raymath.mt +153 -0
  155. data/std/result.mt +89 -0
  156. data/std/rlgl.mt +268 -0
  157. data/std/rpng.mt +46 -0
  158. data/std/rres.mt +36 -0
  159. data/std/sdl3/runtime.mt +54 -0
  160. data/std/sdl3.mt +1731 -0
  161. data/std/serialize.mt +68 -0
  162. data/std/set.mt +124 -0
  163. data/std/spatial.mt +176 -0
  164. data/std/sqlite3.mt +151 -0
  165. data/std/stack.mt +55 -0
  166. data/std/stb_image.mt +47 -0
  167. data/std/stb_image_resize2.mt +41 -0
  168. data/std/stb_image_write.mt +17 -0
  169. data/std/stb_rect_pack.mt +15 -0
  170. data/std/stb_truetype.mt +77 -0
  171. data/std/stb_vorbis.mt +16 -0
  172. data/std/stdio.mt +88 -0
  173. data/std/steamworks.mt +1542 -0
  174. data/std/str.mt +293 -0
  175. data/std/string.mt +234 -0
  176. data/std/sync.mt +194 -0
  177. data/std/tar.mt +704 -0
  178. data/std/terminal.mt +1002 -0
  179. data/std/testing.mt +266 -0
  180. data/std/thread.mt +120 -0
  181. data/std/time.mt +105 -0
  182. data/std/tls.mt +616 -0
  183. data/std/toml.mt +1310 -0
  184. data/std/tracy.mt +42 -0
  185. data/std/uri.mt +118 -0
  186. data/std/url.mt +372 -0
  187. data/std/vec.mt +433 -0
  188. data/std/zstd.mt +94 -0
  189. metadata +187 -2
data/std/json.mt ADDED
@@ -0,0 +1,627 @@
1
+ import std.cjson as cjson
2
+ import std.c.cjson as raw
3
+ import std.mem.arena as arena
4
+ import std.str as text
5
+ import std.string as string
6
+ import std.vec as vec
7
+ import std.mem.heap as heap
8
+
9
+ public struct Error:
10
+ message: string.String
11
+
12
+ public enum ValueKind: int
13
+ null_ = 0
14
+ boolean = 1
15
+ number = 2
16
+ string_ = 3
17
+ array_ = 4
18
+ object_ = 5
19
+
20
+ public struct Value:
21
+ kind: ValueKind
22
+ boolean_value: bool
23
+ number_value: double
24
+ string_value: string.String
25
+ array_value: ptr[Array]?
26
+ object_value: ptr[Object]?
27
+
28
+ public struct Entry:
29
+ key: string.String
30
+ value: Value
31
+
32
+ public struct Object:
33
+ entries: vec.Vec[Entry]
34
+
35
+ public struct Array:
36
+ values: vec.Vec[Value]
37
+
38
+
39
+ function error_message(message: str) -> Error:
40
+ return Error(message = string.String.from_str(message))
41
+
42
+
43
+ public function null_value() -> Value:
44
+ return Value(
45
+ kind = ValueKind.null_,
46
+ boolean_value = false,
47
+ number_value = 0.0,
48
+ string_value = string.String.create(),
49
+ array_value = null,
50
+ object_value = null
51
+ )
52
+
53
+
54
+ public function boolean_value(value: bool) -> Value:
55
+ return Value(
56
+ kind = ValueKind.boolean,
57
+ boolean_value = value,
58
+ number_value = 0.0,
59
+ string_value = string.String.create(),
60
+ array_value = null,
61
+ object_value = null
62
+ )
63
+
64
+
65
+ public function number_value(value: double) -> Value:
66
+ return Value(
67
+ kind = ValueKind.number,
68
+ boolean_value = false,
69
+ number_value = value,
70
+ string_value = string.String.create(),
71
+ array_value = null,
72
+ object_value = null
73
+ )
74
+
75
+
76
+ public function string_value(value: string.String) -> Value:
77
+ return Value(
78
+ kind = ValueKind.string_,
79
+ boolean_value = false,
80
+ number_value = 0.0,
81
+ string_value = value,
82
+ array_value = null,
83
+ object_value = null
84
+ )
85
+
86
+
87
+ public function string_from_str(value: str) -> Value:
88
+ return string_value(string.String.from_str(value))
89
+
90
+
91
+ public function array_value(value: ptr[Array]?) -> Value:
92
+ return Value(
93
+ kind = ValueKind.array_,
94
+ boolean_value = false,
95
+ number_value = 0.0,
96
+ string_value = string.String.create(),
97
+ array_value = value,
98
+ object_value = null
99
+ )
100
+
101
+
102
+ public function object_value(value: ptr[Object]?) -> Value:
103
+ return Value(
104
+ kind = ValueKind.object_,
105
+ boolean_value = false,
106
+ number_value = 0.0,
107
+ string_value = string.String.create(),
108
+ array_value = null,
109
+ object_value = value
110
+ )
111
+
112
+
113
+ public function create_array_value() -> Value:
114
+ let array_ptr = heap.must_alloc[Array](1)
115
+ unsafe:
116
+ read(array_ptr) = Array.create()
117
+ return array_value(array_ptr)
118
+
119
+
120
+ public function create_object_value() -> Value:
121
+ let object_ptr = heap.must_alloc[Object](1)
122
+ unsafe:
123
+ read(object_ptr) = Object.create()
124
+ return object_value(object_ptr)
125
+
126
+
127
+ public function release_value(value: Value) -> void:
128
+ var owned_string = value.string_value
129
+ owned_string.release()
130
+
131
+ let nested_array = value.array_value
132
+ if nested_array != null:
133
+ unsafe:
134
+ read(nested_array).release()
135
+ heap.release(nested_array)
136
+
137
+ let nested_object = value.object_value
138
+ if nested_object != null:
139
+ unsafe:
140
+ read(nested_object).release()
141
+ heap.release(nested_object)
142
+
143
+
144
+ function value_as_boolean(value: Value) -> Option[bool]:
145
+ if value.kind == ValueKind.boolean:
146
+ return Option[bool].some(value = value.boolean_value)
147
+
148
+ return Option[bool].none
149
+
150
+
151
+ function value_as_number(value: Value) -> Option[double]:
152
+ if value.kind == ValueKind.number:
153
+ return Option[double].some(value = value.number_value)
154
+
155
+ return Option[double].none
156
+
157
+
158
+ function value_as_string(value: Value) -> Option[str]:
159
+ if value.kind == ValueKind.string_:
160
+ return Option[str].some(value = value.string_value.as_str())
161
+
162
+ return Option[str].none
163
+
164
+
165
+ function value_as_array(value: Value) -> ptr[Array]?:
166
+ if value.kind == ValueKind.array_:
167
+ return value.array_value
168
+
169
+ return null
170
+
171
+
172
+ function value_as_object(value: Value) -> ptr[Object]?:
173
+ if value.kind == ValueKind.object_:
174
+ return value.object_value
175
+
176
+ return null
177
+
178
+
179
+ function convert_raw_array(item: ptr[cjson.JSON]) -> Result[Value, Error]:
180
+ let array_ptr = heap.must_alloc[Array](1)
181
+ unsafe:
182
+ read(array_ptr) = Array.create()
183
+
184
+ let count = cjson.get_array_size(item)
185
+ if count < 0:
186
+ unsafe:
187
+ read(array_ptr).release()
188
+ heap.release(array_ptr)
189
+ return Result[Value, Error].failure(error = error_message("json array size failed"))
190
+
191
+ var index: int = 0
192
+ while index < count:
193
+ let child = cjson.get_array_item(item, index) else:
194
+ unsafe:
195
+ read(array_ptr).release()
196
+ heap.release(array_ptr)
197
+ return Result[Value, Error].failure(error = error_message("json array item missing"))
198
+
199
+ match convert_raw_value(child):
200
+ Result.failure as payload:
201
+ unsafe:
202
+ read(array_ptr).release()
203
+ heap.release(array_ptr)
204
+ return Result[Value, Error].failure(error = payload.error)
205
+ Result.success as payload:
206
+ unsafe:
207
+ read(array_ptr).values.push(payload.value)
208
+
209
+ index += 1
210
+
211
+ return Result[Value, Error].success(value = array_value(array_ptr))
212
+
213
+
214
+ function convert_raw_object(item: ptr[cjson.JSON]) -> Result[Value, Error]:
215
+ let object_ptr = heap.must_alloc[Object](1)
216
+ unsafe:
217
+ read(object_ptr) = Object.create()
218
+
219
+ var child = unsafe: ptr[cjson.JSON]?<-read(item).child
220
+ while child != null:
221
+ let current = unsafe: child
222
+ let key_ptr = unsafe: ptr[char]?<-read(current).string else:
223
+ unsafe:
224
+ read(object_ptr).release()
225
+ heap.release(object_ptr)
226
+ return Result[Value, Error].failure(error = error_message("json object key missing"))
227
+
228
+ match convert_raw_value(current):
229
+ Result.failure as payload:
230
+ unsafe:
231
+ read(object_ptr).release()
232
+ heap.release(object_ptr)
233
+ return Result[Value, Error].failure(error = payload.error)
234
+ Result.success as payload:
235
+ unsafe:
236
+ read(object_ptr).entries.push(Entry(
237
+ key = string.String.from_str(text.chars_as_str(key_ptr)),
238
+ value = payload.value
239
+ ))
240
+
241
+ child = unsafe: ptr[cjson.JSON]?<-read(current).next
242
+
243
+ return Result[Value, Error].success(value = object_value(object_ptr))
244
+
245
+
246
+ function convert_raw_value(item: ptr[cjson.JSON]?) -> Result[Value, Error]:
247
+ let current = item else:
248
+ return Result[Value, Error].failure(error = error_message("json value missing"))
249
+
250
+ if cjson.is_null(current) != 0:
251
+ return Result[Value, Error].success(value = null_value())
252
+
253
+ if cjson.is_true(current) != 0:
254
+ return Result[Value, Error].success(value = boolean_value(true))
255
+
256
+ if cjson.is_false(current) != 0:
257
+ return Result[Value, Error].success(value = boolean_value(false))
258
+
259
+ if cjson.is_number(current) != 0:
260
+ return Result[Value, Error].success(value = number_value(cjson.get_number_value(current)))
261
+
262
+ if cjson.is_string(current) != 0:
263
+ let raw_text = cjson.get_string_value(current) else:
264
+ return Result[Value, Error].failure(error = error_message("json string value missing"))
265
+ return Result[Value, Error].success(value = string_value(string.String.from_str(text.cstr_as_str(raw_text))))
266
+
267
+ if cjson.is_array(current) != 0:
268
+ return convert_raw_array(current)
269
+
270
+ if cjson.is_object(current) != 0:
271
+ return convert_raw_object(current)
272
+
273
+ return Result[Value, Error].failure(error = error_message("unsupported json value"))
274
+
275
+
276
+ function build_raw_array(array_ptr: ptr[Array]?) -> Result[ptr[cjson.JSON], Error]:
277
+ let current = array_ptr else:
278
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json array value missing"))
279
+
280
+ let array_item = cjson.create_array() else:
281
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create array failed"))
282
+
283
+ unsafe:
284
+ var index: ptr_uint = 0
285
+ while index < read(current).values.len():
286
+ let value_ptr = read(current).values.get(index) else:
287
+ cjson.delete(array_item)
288
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json array value missing"))
289
+
290
+ match build_raw_value(read(value_ptr)):
291
+ Result.failure as payload:
292
+ cjson.delete(array_item)
293
+ return Result[ptr[cjson.JSON], Error].failure(error = payload.error)
294
+ Result.success as payload:
295
+ if cjson.add_item_to_array(array_item, payload.value) == 0:
296
+ cjson.delete(payload.value)
297
+ cjson.delete(array_item)
298
+ return Result[
299
+ ptr[cjson.JSON],
300
+ Error
301
+ ].failure(error = error_message("json add array item failed"))
302
+
303
+ index += 1
304
+
305
+ return Result[ptr[cjson.JSON], Error].success(value = array_item)
306
+
307
+
308
+ function build_raw_object(object_ptr: ptr[Object]?) -> Result[ptr[cjson.JSON], Error]:
309
+ let current = object_ptr else:
310
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json object value missing"))
311
+
312
+ let object_item = cjson.create_object() else:
313
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create object failed"))
314
+
315
+ unsafe:
316
+ var index: ptr_uint = 0
317
+ while index < read(current).entries.len():
318
+ let entry_ptr = read(current).entries.get(index) else:
319
+ cjson.delete(object_item)
320
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json object entry missing"))
321
+
322
+ let entry = read(entry_ptr)
323
+ match build_raw_value(entry.value):
324
+ Result.failure as payload:
325
+ cjson.delete(object_item)
326
+ return Result[ptr[cjson.JSON], Error].failure(error = payload.error)
327
+ Result.success as payload:
328
+ if cjson.add_item_to_object(object_item, entry.key.as_str(), payload.value) == 0:
329
+ cjson.delete(payload.value)
330
+ cjson.delete(object_item)
331
+ return Result[
332
+ ptr[cjson.JSON],
333
+ Error
334
+ ].failure(error = error_message("json add object entry failed"))
335
+
336
+ index += 1
337
+
338
+ return Result[ptr[cjson.JSON], Error].success(value = object_item)
339
+
340
+
341
+ function build_raw_value(value: Value) -> Result[ptr[cjson.JSON], Error]:
342
+ if value.kind == ValueKind.null_:
343
+ let item = cjson.create_null() else:
344
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create null failed"))
345
+ return Result[ptr[cjson.JSON], Error].success(value = item)
346
+
347
+ if value.kind == ValueKind.boolean:
348
+ if value.boolean_value:
349
+ let item = cjson.create_true() else:
350
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create boolean failed"))
351
+ return Result[ptr[cjson.JSON], Error].success(value = item)
352
+
353
+ let item = cjson.create_false() else:
354
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create boolean failed"))
355
+ return Result[ptr[cjson.JSON], Error].success(value = item)
356
+
357
+ if value.kind == ValueKind.number:
358
+ let item = cjson.create_number(value.number_value) else:
359
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create number failed"))
360
+ return Result[ptr[cjson.JSON], Error].success(value = item)
361
+
362
+ if value.kind == ValueKind.string_:
363
+ let item = cjson.create_string(value.string_value.as_str()) else:
364
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("json create string failed"))
365
+ return Result[ptr[cjson.JSON], Error].success(value = item)
366
+
367
+ if value.kind == ValueKind.array_:
368
+ return build_raw_array(value.array_value)
369
+
370
+ if value.kind == ValueKind.object_:
371
+ return build_raw_object(value.object_value)
372
+
373
+ return Result[ptr[cjson.JSON], Error].failure(error = error_message("unsupported json value"))
374
+
375
+
376
+ function render_with_mode(value: Value, pretty: bool) -> Result[string.String, Error]:
377
+ let raw_value = build_raw_value(value)?
378
+ defer cjson.delete(raw_value)
379
+
380
+ if pretty:
381
+ let rendered_ptr = cjson.print(raw_value) else:
382
+ return Result[string.String, Error].failure(error = error_message("json print failed"))
383
+ defer raw.cJSON_free(unsafe: rendered_ptr)
384
+ return Result[
385
+ string.String,
386
+ Error
387
+ ].success(value = string.String.from_str(text.chars_as_str(rendered_ptr)))
388
+
389
+ let rendered_ptr = cjson.print_unformatted(raw_value) else:
390
+ return Result[string.String, Error].failure(error = error_message("json print failed"))
391
+ defer raw.cJSON_free(unsafe: rendered_ptr)
392
+ return Result[string.String, Error].success(value = string.String.from_str(text.chars_as_str(rendered_ptr)))
393
+
394
+
395
+ public function parse(text_value: str) -> Result[Value, Error]:
396
+ var storage = arena.create(text_value.len + 1)
397
+ defer storage.release()
398
+
399
+ let c_text = storage.to_cstr(text_value)
400
+ let raw_value = raw.cJSON_Parse(c_text) else:
401
+ let error_ptr = raw.cJSON_GetErrorPtr()
402
+ if error_ptr == null:
403
+ return Result[Value, Error].failure(error = error_message("json parse failed"))
404
+ let error_text = text.cstr_as_str(unsafe: cstr<-error_ptr)
405
+ if error_text.len == 0:
406
+ return Result[Value, Error].failure(error = error_message("json parse failed"))
407
+ return Result[Value, Error].failure(error = Error(message = string.String.from_str(error_text)))
408
+
409
+ defer raw.cJSON_Delete(raw_value)
410
+ return convert_raw_value(unsafe: ptr[cjson.JSON]?<-raw_value)
411
+
412
+
413
+ public function render(value: Value) -> Result[string.String, Error]:
414
+ return render_with_mode(value, false)
415
+
416
+
417
+ public function render_pretty(value: Value) -> Result[string.String, Error]:
418
+ return render_with_mode(value, true)
419
+
420
+
421
+ extending Error:
422
+ public editable function release() -> void:
423
+ this.message.release()
424
+
425
+
426
+ extending Value:
427
+ public function is_null() -> bool:
428
+ return this.kind == ValueKind.null_
429
+
430
+
431
+ public function as_boolean() -> Option[bool]:
432
+ return value_as_boolean(this)
433
+
434
+
435
+ public function as_number() -> Option[double]:
436
+ return value_as_number(this)
437
+
438
+
439
+ public function as_string() -> Option[str]:
440
+ return value_as_string(this)
441
+
442
+
443
+ public function as_array() -> ptr[Array]?:
444
+ return value_as_array(this)
445
+
446
+
447
+ public function as_object() -> ptr[Object]?:
448
+ return value_as_object(this)
449
+
450
+
451
+ extending Entry:
452
+ public editable function release() -> void:
453
+ this.key.release()
454
+ release_value(this.value)
455
+
456
+
457
+ extending Object:
458
+ public static function create() -> Object:
459
+ return Object(entries = vec.Vec[Entry].create())
460
+
461
+
462
+ static function find_entry(current: Object, key: str) -> ptr[Entry]?:
463
+ return current.entries.find(proc(entry: ptr[Entry]) -> bool: unsafe: read(entry).key.as_str().equal(key))
464
+
465
+
466
+ public function len() -> ptr_uint:
467
+ return this.entries.len()
468
+
469
+
470
+ public function contains(key: str) -> bool:
471
+ return Object.find_entry(this, key) != null
472
+
473
+
474
+ public function get(key: str) -> ptr[Value]?:
475
+ let entry = Object.find_entry(this, key) else:
476
+ return null
477
+
478
+ unsafe:
479
+ return ptr_of(read(entry).value)
480
+
481
+
482
+ public function at(key: str) -> Option[Value]:
483
+ let p = this.get(key) else:
484
+ return Option[Value].none
485
+
486
+ unsafe:
487
+ return Option[Value].some(value = read(p))
488
+
489
+
490
+ public function get_boolean(key: str) -> Option[bool]:
491
+ let entry = Object.find_entry(this, key) else:
492
+ return Option[bool].none
493
+
494
+ unsafe:
495
+ return value_as_boolean(read(entry).value)
496
+
497
+
498
+ public function get_number(key: str) -> Option[double]:
499
+ let entry = Object.find_entry(this, key) else:
500
+ return Option[double].none
501
+
502
+ unsafe:
503
+ return value_as_number(read(entry).value)
504
+
505
+
506
+ public function get_string(key: str) -> Option[str]:
507
+ let entry = Object.find_entry(this, key) else:
508
+ return Option[str].none
509
+
510
+ unsafe:
511
+ return value_as_string(read(entry).value)
512
+
513
+
514
+ public function get_array(key: str) -> ptr[Array]?:
515
+ let entry = Object.find_entry(this, key) else:
516
+ return null
517
+
518
+ unsafe:
519
+ return value_as_array(read(entry).value)
520
+
521
+
522
+ public function get_object(key: str) -> ptr[Object]?:
523
+ let entry = Object.find_entry(this, key) else:
524
+ return null
525
+
526
+ unsafe:
527
+ return value_as_object(read(entry).value)
528
+
529
+
530
+ public editable function set(key: str, value: Value) -> void:
531
+ let entry = Object.find_entry(this, key)
532
+ if entry != null:
533
+ unsafe:
534
+ release_value(read(entry).value)
535
+ read(entry).value = value
536
+ return
537
+
538
+ this.entries.push(Entry(key = string.String.from_str(key), value = value))
539
+
540
+
541
+ public editable function release() -> void:
542
+ var index: ptr_uint = 0
543
+ while index < this.entries.len():
544
+ let entry = this.entries.get(index) else:
545
+ fatal(c"json.Object.release missing entry")
546
+
547
+ unsafe:
548
+ read(entry).release()
549
+
550
+ index += 1
551
+
552
+ this.entries.release()
553
+
554
+
555
+ extending Array:
556
+ public static function create() -> Array:
557
+ return Array(values = vec.Vec[Value].create())
558
+
559
+
560
+ public function len() -> ptr_uint:
561
+ return this.values.len()
562
+
563
+
564
+ public function get(index: ptr_uint) -> ptr[Value]?:
565
+ return this.values.get(index)
566
+
567
+
568
+ public function at(index: ptr_uint) -> Option[Value]:
569
+ return this.values.at(index)
570
+
571
+
572
+ public function get_boolean(index: ptr_uint) -> Option[bool]:
573
+ let value_ptr = this.get(index) else:
574
+ return Option[bool].none
575
+
576
+ unsafe:
577
+ return value_as_boolean(read(value_ptr))
578
+
579
+
580
+ public function get_number(index: ptr_uint) -> Option[double]:
581
+ let value_ptr = this.get(index) else:
582
+ return Option[double].none
583
+
584
+ unsafe:
585
+ return value_as_number(read(value_ptr))
586
+
587
+
588
+ public function get_string(index: ptr_uint) -> Option[str]:
589
+ let value_ptr = this.get(index) else:
590
+ return Option[str].none
591
+
592
+ unsafe:
593
+ return value_as_string(read(value_ptr))
594
+
595
+
596
+ public function get_array(index: ptr_uint) -> ptr[Array]?:
597
+ let value_ptr = this.get(index) else:
598
+ return null
599
+
600
+ unsafe:
601
+ return value_as_array(read(value_ptr))
602
+
603
+
604
+ public function get_object(index: ptr_uint) -> ptr[Object]?:
605
+ let value_ptr = this.get(index) else:
606
+ return null
607
+
608
+ unsafe:
609
+ return value_as_object(read(value_ptr))
610
+
611
+
612
+ public editable function push(value: Value) -> void:
613
+ this.values.push(value)
614
+
615
+
616
+ public editable function release() -> void:
617
+ var index: ptr_uint = 0
618
+ while index < this.values.len():
619
+ let value_ptr = this.values.get(index) else:
620
+ fatal(c"json.Array.release missing value")
621
+
622
+ unsafe:
623
+ release_value(read(value_ptr))
624
+
625
+ index += 1
626
+
627
+ this.values.release()
data/std/libc.mt ADDED
@@ -0,0 +1,34 @@
1
+ import std.c.libc as c
2
+
3
+ public type IntDiv = c.div_t
4
+ public type PtrIntDiv = c.ldiv_t
5
+ public type LongDiv = c.lldiv_t
6
+
7
+ public const EXIT_FAILURE: int = c.EXIT_FAILURE
8
+ public const EXIT_SUCCESS: int = c.EXIT_SUCCESS
9
+
10
+ public foreign function parse_double(text: str as cstr) -> double = c.atof
11
+ public foreign function parse_int(text: str as cstr) -> int = c.atoi
12
+ public foreign function parse_long(text: str as cstr) -> ptr_int = c.atol
13
+ public foreign function parse_long_long(text: str as cstr) -> long = c.atoll
14
+ public foreign function parse_float_to_end(text: str as cstr, end_ptr: ptr[ptr[char]]?) -> float = c.strtof
15
+ public foreign function parse_double_to_end(text: str as cstr, end_ptr: ptr[ptr[char]]?) -> double = c.strtod
16
+ public foreign function parse_long_to_end(text: str as cstr, end_ptr: ptr[ptr[char]]?, base: int) -> ptr_int = c.strtol
17
+ public foreign function parse_ulong_to_end(text: str as cstr, end_ptr: ptr[ptr[char]]?, base: int) -> ptr_uint = c.strtoul
18
+ public foreign function parse_long_long_to_end(text: str as cstr, end_ptr: ptr[ptr[char]]?, base: int) -> long = c.strtoll
19
+ public foreign function parse_ulong_long_to_end(text: str as cstr, end_ptr: ptr[ptr[char]]?, base: int) -> ulong = c.strtoull
20
+ public foreign function get_environment_variable(name: str as cstr) -> cstr? = c.getenv
21
+ public foreign function set_environment_variable(name: str as cstr, value: str as cstr, overwrite: int) -> int = c.setenv
22
+ public foreign function unset_environment_variable(name: str as cstr) -> int = c.unsetenv
23
+ public foreign function create_temp_file[N](template: str_buffer[N] as ptr[char]) -> int = c.mkstemp
24
+ public foreign function create_temp_file_with_suffix[N](template: str_buffer[N] as ptr[char], suffix_length: int) -> int = c.mkstemps
25
+ public foreign function create_temp_directory[N](template: str_buffer[N] as ptr[char]) -> cstr? = c.mkdtemp
26
+ public foreign function resolve_path[N](name: str as cstr, resolved: str_buffer[N] as ptr[char]) -> cstr? = c.realpath
27
+ public foreign function binary_search(key: const_ptr[void], base: const_ptr[void], count: ptr_uint, element_size: ptr_uint, compare: fn(a: const_ptr[void], b: const_ptr[void]) -> int) -> ptr[void]? = c.bsearch
28
+ public foreign function sort_array(base: ptr[void], count: ptr_uint, element_size: ptr_uint, compare: fn(a: const_ptr[void], b: const_ptr[void]) -> int) -> void = c.qsort
29
+ public foreign function abs_int(value: int) -> int = c.abs
30
+ public foreign function abs_long(value: ptr_int) -> ptr_int = c.labs
31
+ public foreign function abs_long_long(value: long) -> long = c.llabs
32
+ public foreign function divide_int(numerator: int, denominator: int) -> IntDiv = c.div
33
+ public foreign function divide_long(numerator: ptr_int, denominator: ptr_int) -> PtrIntDiv = c.ldiv
34
+ public foreign function divide_long_long(numerator: long, denominator: long) -> LongDiv = c.lldiv