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.
- checksums.yaml +4 -4
- data/docs/index.html +4 -3
- data/lib/milk_tea/base.rb +1 -1
- data/std/asset_pack.mt +267 -0
- data/std/async/libuv_runtime.mt +539 -0
- data/std/async/mailbox.mt +191 -0
- data/std/async/runtime.mt +87 -0
- data/std/async.mt +87 -0
- data/std/base64.mt +185 -0
- data/std/behavior_tree.mt +396 -0
- data/std/binary.mt +314 -0
- data/std/binary_heap.mt +157 -0
- data/std/bitset.mt +239 -0
- data/std/box2d.mt +535 -0
- data/std/bytes.mt +46 -0
- data/std/c/box2d.mt +1254 -0
- data/std/c/cgltf.mt +647 -0
- data/std/c/cjson.mt +106 -0
- data/std/c/crypto.mt +11 -0
- data/std/c/crypto_support.h +51 -0
- data/std/c/ctype.mt +19 -0
- data/std/c/ctype_bindgen.h +29 -0
- data/std/c/curl.mt +1223 -0
- data/std/c/enet.mt +473 -0
- data/std/c/errno.mt +41 -0
- data/std/c/errno_bindgen.h +53 -0
- data/std/c/flecs.mt +2945 -0
- data/std/c/fs.linux.mt +43 -0
- data/std/c/fs.windows.mt +43 -0
- data/std/c/fs_support.h +954 -0
- data/std/c/gl.mt +2065 -0
- data/std/c/gl_registry_helpers.h +10748 -0
- data/std/c/glfw.mt +499 -0
- data/std/c/libc.mt +167 -0
- data/std/c/libuv.mt +1491 -0
- data/std/c/math.mt +22 -0
- data/std/c/math_bindgen.h +31 -0
- data/std/c/miniaudio.mt +3420 -0
- data/std/c/pcre2.mt +735 -0
- data/std/c/process.mt +58 -0
- data/std/c/process_support.h +1147 -0
- data/std/c/raygui.mt +1602 -0
- data/std/c/raylib.mt +1245 -0
- data/std/c/raymath.mt +163 -0
- data/std/c/rlgl.mt +434 -0
- data/std/c/rpng.mt +60 -0
- data/std/c/rres.mt +187 -0
- data/std/c/sdl3.mt +4132 -0
- data/std/c/sqlite3.mt +951 -0
- data/std/c/stb_image.mt +52 -0
- data/std/c/stb_image_resize2.mt +128 -0
- data/std/c/stb_image_write.mt +19 -0
- data/std/c/stb_rect_pack.mt +38 -0
- data/std/c/stb_truetype.mt +175 -0
- data/std/c/stb_vorbis.mt +31 -0
- data/std/c/stdio.mt +90 -0
- data/std/c/steamworks.h +5769 -0
- data/std/c/steamworks.mt +4771 -0
- data/std/c/string.mt +16 -0
- data/std/c/string_bindgen.h +36 -0
- data/std/c/sync.mt +33 -0
- data/std/c/sync_support.h +219 -0
- data/std/c/terminal.mt +24 -0
- data/std/c/terminal_support.h +408 -0
- data/std/c/time.mt +26 -0
- data/std/c/tls.mt +24 -0
- data/std/c/tls_support.h +626 -0
- data/std/c/tracy.mt +53 -0
- data/std/c/zlib.mt +20 -0
- data/std/c/zlib_support.h +239 -0
- data/std/c/zstd.mt +231 -0
- data/std/cell.mt +60 -0
- data/std/cgltf.mt +115 -0
- data/std/cjson.mt +90 -0
- data/std/cli.mt +768 -0
- data/std/cookie.mt +198 -0
- data/std/counter.mt +160 -0
- data/std/crypto.mt +74 -0
- data/std/cstring.mt +13 -0
- data/std/ctype.mt +52 -0
- data/std/curl/runtime.mt +261 -0
- data/std/curl.mt +38 -0
- data/std/deque.mt +348 -0
- data/std/encoding.mt +93 -0
- data/std/enet.mt +133 -0
- data/std/env.mt +41 -0
- data/std/errno.mt +47 -0
- data/std/flecs.mt +978 -0
- data/std/fmt.mt +271 -0
- data/std/fs.linux.mt +696 -0
- data/std/fs.windows.mt +711 -0
- data/std/fsm.mt +267 -0
- data/std/gl.mt +2062 -0
- data/std/glfw.mt +471 -0
- data/std/goap.mt +342 -0
- data/std/graph.mt +521 -0
- data/std/gzip.mt +77 -0
- data/std/hash.mt +429 -0
- data/std/http/server.mt +810 -0
- data/std/http.mt +1227 -0
- data/std/intern.mt +53 -0
- data/std/jobs.mt +288 -0
- data/std/json.mt +627 -0
- data/std/libc.mt +34 -0
- data/std/libuv.mt +554 -0
- data/std/linear_algebra.mt +243 -0
- data/std/linked_map.mt +372 -0
- data/std/linked_map_view.mt +49 -0
- data/std/linked_set.mt +117 -0
- data/std/log.mt +69 -0
- data/std/map.mt +418 -0
- data/std/math.mt +24 -0
- data/std/mem/arena.mt +137 -0
- data/std/mem/endian.mt +51 -0
- data/std/mem/heap.mt +298 -0
- data/std/mem/pool.mt +164 -0
- data/std/mem/stack.mt +47 -0
- data/std/mem/tracking.mt +119 -0
- data/std/miniaudio.mt +1299 -0
- data/std/multiset.mt +191 -0
- data/std/net/channel.mt +727 -0
- data/std/net/clock.mt +237 -0
- data/std/net/discovery.mt +277 -0
- data/std/net/lobby.mt +813 -0
- data/std/net/manager.mt +539 -0
- data/std/net/mux.mt +839 -0
- data/std/net/nat.mt +122 -0
- data/std/net/packet.mt +219 -0
- data/std/net/punch.mt +162 -0
- data/std/net/rpc.mt +119 -0
- data/std/net/session.mt +1157 -0
- data/std/net/stun.mt +252 -0
- data/std/net/sync.mt +183 -0
- data/std/net/turn.mt +459 -0
- data/std/net.mt +2944 -0
- data/std/oauth2.mt +408 -0
- data/std/option.mt +51 -0
- data/std/ordered_map.mt +497 -0
- data/std/ordered_set.mt +348 -0
- data/std/path.mt +368 -0
- data/std/pcre2/runtime.mt +35 -0
- data/std/pcre2.mt +78 -0
- data/std/priority_queue.mt +55 -0
- data/std/process.mt +837 -0
- data/std/queue.mt +55 -0
- data/std/random.mt +146 -0
- data/std/raygui.mt +99 -0
- data/std/raylib/debug_console.mt +71 -0
- data/std/raylib/easing.mt +388 -0
- data/std/raylib/packed_assets.mt +255 -0
- data/std/raylib/runtime.mt +30 -0
- data/std/raylib/tracy_gpu.mt +37 -0
- data/std/raylib.mt +1510 -0
- data/std/raymath.mt +153 -0
- data/std/result.mt +89 -0
- data/std/rlgl.mt +268 -0
- data/std/rpng.mt +46 -0
- data/std/rres.mt +36 -0
- data/std/sdl3/runtime.mt +54 -0
- data/std/sdl3.mt +1731 -0
- data/std/serialize.mt +68 -0
- data/std/set.mt +124 -0
- data/std/spatial.mt +176 -0
- data/std/sqlite3.mt +151 -0
- data/std/stack.mt +55 -0
- data/std/stb_image.mt +47 -0
- data/std/stb_image_resize2.mt +41 -0
- data/std/stb_image_write.mt +17 -0
- data/std/stb_rect_pack.mt +15 -0
- data/std/stb_truetype.mt +77 -0
- data/std/stb_vorbis.mt +16 -0
- data/std/stdio.mt +88 -0
- data/std/steamworks.mt +1542 -0
- data/std/str.mt +293 -0
- data/std/string.mt +234 -0
- data/std/sync.mt +194 -0
- data/std/tar.mt +704 -0
- data/std/terminal.mt +1002 -0
- data/std/testing.mt +266 -0
- data/std/thread.mt +120 -0
- data/std/time.mt +105 -0
- data/std/tls.mt +616 -0
- data/std/toml.mt +1310 -0
- data/std/tracy.mt +42 -0
- data/std/uri.mt +118 -0
- data/std/url.mt +372 -0
- data/std/vec.mt +433 -0
- data/std/zstd.mt +94 -0
- 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
|