@shd101wyy/yo 0.0.23 → 0.0.25
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.
- package/out/cjs/index.cjs +560 -520
- package/out/cjs/yo-cli.cjs +598 -558
- package/out/esm/index.mjs +551 -511
- package/out/types/src/codegen/exprs/arc.d.ts +5 -0
- package/out/types/src/codegen/types/generation.d.ts +2 -0
- package/out/types/src/codegen/utils/index.d.ts +8 -1
- package/out/types/src/evaluator/builtins/rc-fns.d.ts +5 -0
- package/out/types/src/evaluator/calls/arc.d.ts +15 -0
- package/out/types/src/evaluator/calls/trait-type.d.ts +8 -1
- package/out/types/src/evaluator/context.d.ts +11 -1
- package/out/types/src/evaluator/types/utils.d.ts +8 -3
- package/out/types/src/evaluator/utils/closure.d.ts +7 -1
- package/out/types/src/evaluator/values/impl.d.ts +8 -0
- package/out/types/src/expr.d.ts +6 -0
- package/out/types/src/test-runner.d.ts +2 -0
- package/out/types/src/types/creators.d.ts +2 -1
- package/out/types/src/types/definitions.d.ts +10 -0
- package/out/types/src/types/guards.d.ts +2 -1
- package/out/types/src/types/tags.d.ts +1 -0
- package/out/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/std/collections/array_list.yo +80 -10
- package/std/collections/btree_map.yo +120 -2
- package/std/collections/deque.yo +98 -6
- package/std/collections/hash_map.yo +137 -1
- package/std/collections/hash_set.yo +85 -1
- package/std/collections/linked_list.yo +61 -1
- package/std/collections/priority_queue.yo +70 -1
- package/std/crypto/md5.yo +4 -4
- package/std/crypto/random.yo +3 -3
- package/std/crypto/sha256.yo +8 -7
- package/std/encoding/base64.yo +6 -6
- package/std/encoding/hex.yo +27 -22
- package/std/encoding/json.yo +185 -186
- package/std/encoding/utf16.yo +2 -2
- package/std/fmt/display.yo +1 -1
- package/std/fmt/writer.yo +2 -4
- package/std/fs/dir.yo +5 -5
- package/std/fs/file.yo +21 -13
- package/std/fs/metadata.yo +4 -4
- package/std/fs/temp.yo +3 -3
- package/std/fs/types.yo +1 -1
- package/std/fs/walker.yo +1 -1
- package/std/net/addr.yo +2 -2
- package/std/net/dns.yo +21 -20
- package/std/net/errors.yo +1 -1
- package/std/net/tcp.yo +134 -100
- package/std/net/udp.yo +51 -42
- package/std/os/env.yo +21 -23
- package/std/os/signal.yo +10 -9
- package/std/prelude.yo +158 -22
- package/std/string/string.yo +99 -1
- package/std/sync/once.yo +1 -1
- package/std/{io → sys}/advise.yo +1 -1
- package/std/sys/bufio/buf_reader.yo +300 -0
- package/std/sys/bufio/buf_writer.yo +168 -0
- package/std/{io → sys}/clock.yo +1 -1
- package/std/{io → sys}/constants.yo +1 -1
- package/std/{io → sys}/copy.yo +1 -1
- package/std/{io → sys}/dir.yo +6 -6
- package/std/{io → sys}/dns.yo +3 -3
- package/std/{io → sys}/errors.yo +1 -1
- package/std/{io → sys}/events.yo +1 -1
- package/std/{io → sys}/externs.yo +1 -1
- package/std/{io → sys}/fallocate.yo +1 -1
- package/std/{io → sys}/fcntl.yo +1 -1
- package/std/{io → sys}/file.yo +1 -1
- package/std/{io → sys}/future.yo +1 -1
- package/std/{io → sys}/iov.yo +1 -1
- package/std/{io → sys}/lock.yo +1 -1
- package/std/{io → sys}/mmap.yo +1 -1
- package/std/{io → sys}/path.yo +1 -1
- package/std/{io → sys}/perm.yo +3 -3
- package/std/{io → sys}/pipe.yo +1 -1
- package/std/{io → sys}/process.yo +1 -1
- package/std/{io → sys}/seek.yo +1 -1
- package/std/{io → sys}/signal.yo +1 -1
- package/std/{io → sys}/signals.yo +1 -1
- package/std/{io → sys}/socket.yo +1 -1
- package/std/{io → sys}/socketpair.yo +1 -1
- package/std/{io → sys}/sockinfo.yo +1 -1
- package/std/{io → sys}/statfs.yo +2 -2
- package/std/{io → sys}/statx.yo +1 -1
- package/std/{io → sys}/sysinfo.yo +1 -1
- package/std/{io → sys}/tcp.yo +3 -3
- package/std/{io → sys}/temp.yo +1 -1
- package/std/{io → sys}/time.yo +2 -2
- package/std/{io → sys}/timer.yo +1 -1
- package/std/{io → sys}/tty.yo +1 -1
- package/std/{io → sys}/udp.yo +4 -4
- package/std/{io → sys}/umask.yo +1 -1
- package/std/{io → sys}/unix.yo +1 -1
- package/std/time/datetime.yo +18 -23
- package/std/time/instant.yo +13 -11
- package/std/url/url.yo +533 -0
- package/std/math/functions.yo +0 -74
- package/std/math/random.yo +0 -94
package/std/encoding/json.yo
CHANGED
|
@@ -17,48 +17,49 @@ open import "../string";
|
|
|
17
17
|
// ============================================================================
|
|
18
18
|
|
|
19
19
|
JsonError :: enum(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
UnexpectedChar(ch: u8, pos: usize),
|
|
21
|
+
UnexpectedEnd,
|
|
22
|
+
InvalidNumber,
|
|
23
|
+
InvalidEscape,
|
|
24
|
+
InvalidUnicode,
|
|
25
|
+
Other(msg: String)
|
|
26
26
|
);
|
|
27
27
|
|
|
28
28
|
export JsonError;
|
|
29
29
|
|
|
30
30
|
// ============================================================================
|
|
31
|
-
//
|
|
31
|
+
// JsonValue
|
|
32
32
|
// ============================================================================
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
value
|
|
34
|
+
JsonValue :: enum(
|
|
35
|
+
Null,
|
|
36
|
+
Bool(value: bool),
|
|
37
|
+
Number(value: f64),
|
|
38
|
+
Str(value: String),
|
|
39
|
+
Array(items: ArrayList(Self)),
|
|
40
|
+
Object(keys: ArrayList(String), values: ArrayList(Self))
|
|
37
41
|
);
|
|
38
42
|
|
|
39
43
|
// ============================================================================
|
|
40
|
-
//
|
|
44
|
+
// JsonKV - key/value pair convenience struct for Object
|
|
41
45
|
// ============================================================================
|
|
42
46
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.Number(value: f64),
|
|
47
|
-
.Str(value: String),
|
|
48
|
-
.Array(items: ArrayList(JsonValue)),
|
|
49
|
-
.Object(fields: ArrayList(JsonKV))
|
|
47
|
+
JsonKV :: struct(
|
|
48
|
+
key : String,
|
|
49
|
+
value : JsonValue
|
|
50
50
|
);
|
|
51
51
|
|
|
52
52
|
impl(JsonValue,
|
|
53
53
|
// Get a field from an Object value. Returns .None if not an Object or key missing.
|
|
54
|
-
get : (fn(self: Self, key: String) ->
|
|
54
|
+
get : (fn(self: Self, key: String) -> Option(JsonValue))(
|
|
55
55
|
match(self,
|
|
56
|
-
.Object(
|
|
56
|
+
.Object(keys, values) => {
|
|
57
57
|
i := usize(0);
|
|
58
|
-
while (i <
|
|
59
|
-
kv := fields.get(i).unwrap();
|
|
58
|
+
while (i < keys.len()), (i = (i + usize(1))), {
|
|
60
59
|
cond(
|
|
61
|
-
(
|
|
60
|
+
(keys.get(i).unwrap() == key) => {
|
|
61
|
+
return .Some(values.get(i).unwrap());
|
|
62
|
+
},
|
|
62
63
|
true => ()
|
|
63
64
|
);
|
|
64
65
|
};
|
|
@@ -69,7 +70,7 @@ impl(JsonValue,
|
|
|
69
70
|
),
|
|
70
71
|
|
|
71
72
|
// Get an element from an Array value by index.
|
|
72
|
-
at : (fn(self: Self, index: usize) ->
|
|
73
|
+
at : (fn(self: Self, index: usize) -> Option(JsonValue))(
|
|
73
74
|
match(self,
|
|
74
75
|
.Array(items) => items.get(index),
|
|
75
76
|
_ => .None
|
|
@@ -77,7 +78,7 @@ impl(JsonValue,
|
|
|
77
78
|
),
|
|
78
79
|
|
|
79
80
|
// Extract a bool.
|
|
80
|
-
as_bool : (fn(self: Self) ->
|
|
81
|
+
as_bool : (fn(self: Self) -> Option(bool))(
|
|
81
82
|
match(self,
|
|
82
83
|
.Bool(b) => .Some(b),
|
|
83
84
|
_ => .None
|
|
@@ -85,7 +86,7 @@ impl(JsonValue,
|
|
|
85
86
|
),
|
|
86
87
|
|
|
87
88
|
// Extract a number.
|
|
88
|
-
as_number : (fn(self: Self) ->
|
|
89
|
+
as_number : (fn(self: Self) -> Option(f64))(
|
|
89
90
|
match(self,
|
|
90
91
|
.Number(n) => .Some(n),
|
|
91
92
|
_ => .None
|
|
@@ -93,7 +94,7 @@ impl(JsonValue,
|
|
|
93
94
|
),
|
|
94
95
|
|
|
95
96
|
// Extract a string.
|
|
96
|
-
as_string : (fn(self: Self) ->
|
|
97
|
+
as_string : (fn(self: Self) -> Option(String))(
|
|
97
98
|
match(self,
|
|
98
99
|
.Str(s) => .Some(s),
|
|
99
100
|
_ => .None
|
|
@@ -101,17 +102,24 @@ impl(JsonValue,
|
|
|
101
102
|
),
|
|
102
103
|
|
|
103
104
|
// Extract an array.
|
|
104
|
-
as_array : (fn(self: Self) ->
|
|
105
|
+
as_array : (fn(self: Self) -> Option(ArrayList(JsonValue)))(
|
|
105
106
|
match(self,
|
|
106
107
|
.Array(items) => .Some(items),
|
|
107
108
|
_ => .None
|
|
108
109
|
)
|
|
109
110
|
),
|
|
110
111
|
|
|
111
|
-
// Extract
|
|
112
|
-
as_object : (fn(self: Self) ->
|
|
112
|
+
// Extract object entries as ArrayList(JsonKV).
|
|
113
|
+
as_object : (fn(self: Self) -> Option(ArrayList(JsonKV)))(
|
|
113
114
|
match(self,
|
|
114
|
-
.Object(
|
|
115
|
+
.Object(keys, values) => {
|
|
116
|
+
result := ArrayList(JsonKV).new();
|
|
117
|
+
i := usize(0);
|
|
118
|
+
while (i < keys.len()), (i = (i + usize(1))), {
|
|
119
|
+
result.push(JsonKV(key: keys.get(i).unwrap(), value: values.get(i).unwrap()));
|
|
120
|
+
};
|
|
121
|
+
.Some(result)
|
|
122
|
+
},
|
|
115
123
|
_ => .None
|
|
116
124
|
)
|
|
117
125
|
)
|
|
@@ -133,24 +141,24 @@ impl(_Parser,
|
|
|
133
141
|
Self(src: src, pos: usize(0))
|
|
134
142
|
),
|
|
135
143
|
|
|
136
|
-
peek : (fn(self: Self) ->
|
|
144
|
+
peek : (fn(self: Self) -> Option(u8))(
|
|
137
145
|
cond(
|
|
138
146
|
(self.pos < self.src.len()) => .Some(self.src.bytes(self.pos)),
|
|
139
147
|
true => .None
|
|
140
148
|
)
|
|
141
149
|
),
|
|
142
150
|
|
|
143
|
-
advance : (fn(self: Self) -> unit)(
|
|
144
|
-
self.pos = (self.pos + usize(1))
|
|
145
|
-
),
|
|
151
|
+
advance : (fn(self: Self) -> unit)({
|
|
152
|
+
self.pos = (self.pos + usize(1));
|
|
153
|
+
}),
|
|
146
154
|
|
|
147
155
|
skip_ws : (fn(self: Self) -> unit)({
|
|
148
|
-
while runtime(true),
|
|
156
|
+
while runtime(true), {
|
|
149
157
|
match(self.peek(),
|
|
150
158
|
.None => break,
|
|
151
159
|
.Some(c) => {
|
|
152
160
|
cond(
|
|
153
|
-
((c == u8(32)) || (c == u8(9)) || (c == u8(10)) || (c == u8(13))) => {
|
|
161
|
+
((((c == u8(32)) || (c == u8(9))) || (c == u8(10))) || (c == u8(13))) => {
|
|
154
162
|
self.advance();
|
|
155
163
|
},
|
|
156
164
|
true => break
|
|
@@ -164,7 +172,7 @@ impl(_Parser,
|
|
|
164
172
|
self.skip_ws();
|
|
165
173
|
match(self.peek(),
|
|
166
174
|
.None => .Err(.UnexpectedEnd),
|
|
167
|
-
.Some(c) =>
|
|
175
|
+
.Some(c) =>
|
|
168
176
|
cond(
|
|
169
177
|
(c == ch) => {
|
|
170
178
|
self.advance();
|
|
@@ -172,14 +180,13 @@ impl(_Parser,
|
|
|
172
180
|
},
|
|
173
181
|
true => .Err(.UnexpectedChar(c, self.pos))
|
|
174
182
|
)
|
|
175
|
-
}
|
|
176
183
|
)
|
|
177
184
|
}),
|
|
178
185
|
|
|
179
186
|
parse_string : (fn(self: Self) -> Result(String, JsonError))({
|
|
180
187
|
self.advance(); // skip opening '"'
|
|
181
188
|
bytes := ArrayList(u8).new();
|
|
182
|
-
while runtime(true),
|
|
189
|
+
while runtime(true), {
|
|
183
190
|
match(self.peek(),
|
|
184
191
|
.None => { return .Err(.UnexpectedEnd); },
|
|
185
192
|
.Some(c) => {
|
|
@@ -230,7 +237,7 @@ impl(_Parser,
|
|
|
230
237
|
},
|
|
231
238
|
.None => ()
|
|
232
239
|
);
|
|
233
|
-
while runtime(true),
|
|
240
|
+
while runtime(true), {
|
|
234
241
|
match(self.peek(),
|
|
235
242
|
.Some(c) => {
|
|
236
243
|
cond(
|
|
@@ -246,7 +253,7 @@ impl(_Parser,
|
|
|
246
253
|
cond(
|
|
247
254
|
(c == u8(46)) => { // '.'
|
|
248
255
|
self.advance();
|
|
249
|
-
while runtime(true),
|
|
256
|
+
while runtime(true), {
|
|
250
257
|
match(self.peek(),
|
|
251
258
|
.Some(d) => {
|
|
252
259
|
cond(
|
|
@@ -277,7 +284,7 @@ impl(_Parser,
|
|
|
277
284
|
},
|
|
278
285
|
.None => ()
|
|
279
286
|
);
|
|
280
|
-
while runtime(true),
|
|
287
|
+
while runtime(true), {
|
|
281
288
|
match(self.peek(),
|
|
282
289
|
.Some(d) => {
|
|
283
290
|
cond(
|
|
@@ -305,145 +312,138 @@ impl(_Parser,
|
|
|
305
312
|
{ atof } :: import "../libc/stdlib";
|
|
306
313
|
val := atof(num_ptr);
|
|
307
314
|
.Ok(val)
|
|
308
|
-
})
|
|
315
|
+
})
|
|
316
|
+
);
|
|
309
317
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
.None => .Err(.UnexpectedEnd),
|
|
314
|
-
.Some(c) => {
|
|
315
|
-
cond(
|
|
316
|
-
(c == u8(34)) => { // '"'
|
|
317
|
-
match(self.parse_string(),
|
|
318
|
-
.Err(e) => .Err(e),
|
|
319
|
-
.Ok(s) => .Ok(.Str(s))
|
|
320
|
-
)
|
|
321
|
-
},
|
|
322
|
-
(c == u8(123)) => { // '{'
|
|
323
|
-
self.parse_object()
|
|
324
|
-
},
|
|
325
|
-
(c == u8(91)) => { // '['
|
|
326
|
-
self.parse_array()
|
|
327
|
-
},
|
|
328
|
-
(c == u8(116)) => { // 't' (true)
|
|
329
|
-
self.advance(); self.advance(); self.advance(); self.advance();
|
|
330
|
-
.Ok(.Bool(true))
|
|
331
|
-
},
|
|
332
|
-
(c == u8(102)) => { // 'f' (false)
|
|
333
|
-
self.advance(); self.advance(); self.advance();
|
|
334
|
-
self.advance(); self.advance();
|
|
335
|
-
.Ok(.Bool(false))
|
|
336
|
-
},
|
|
337
|
-
(c == u8(110)) => { // 'n' (null)
|
|
338
|
-
self.advance(); self.advance(); self.advance(); self.advance();
|
|
339
|
-
.Ok(.Null)
|
|
340
|
-
},
|
|
341
|
-
true => {
|
|
342
|
-
match(self.parse_number(),
|
|
343
|
-
.Err(e) => .Err(e),
|
|
344
|
-
.Ok(n) => .Ok(.Number(n))
|
|
345
|
-
)
|
|
346
|
-
}
|
|
347
|
-
)
|
|
348
|
-
}
|
|
349
|
-
)
|
|
350
|
-
}),
|
|
318
|
+
// ============================================================================
|
|
319
|
+
// Recursive value parser (standalone for self-recursion support)
|
|
320
|
+
// ============================================================================
|
|
351
321
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
},
|
|
366
|
-
.None => ()
|
|
367
|
-
);
|
|
368
|
-
while runtime(true), () => {
|
|
369
|
-
match(self.parse_value(),
|
|
370
|
-
.Err(e) => { return .Err(e); },
|
|
371
|
-
.Ok(v) => { items.push(v); }
|
|
372
|
-
);
|
|
373
|
-
self.skip_ws();
|
|
374
|
-
match(self.peek(),
|
|
375
|
-
.Some(c) => {
|
|
376
|
-
cond(
|
|
377
|
-
(c == u8(44)) => { self.advance(); }, // ','
|
|
378
|
-
(c == u8(93)) => { self.advance(); break; }, // ']'
|
|
379
|
-
true => { return .Err(.UnexpectedChar(c, self.pos)); }
|
|
380
|
-
);
|
|
381
|
-
},
|
|
382
|
-
.None => { return .Err(.UnexpectedEnd); }
|
|
383
|
-
);
|
|
384
|
-
};
|
|
385
|
-
.Ok(.Array(items))
|
|
386
|
-
}),
|
|
322
|
+
// Tiny helpers to avoid begin blocks in cond branches (works around codegen temp var issue)
|
|
323
|
+
_parse_true_lit :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
|
|
324
|
+
p.advance(); p.advance(); p.advance(); p.advance();
|
|
325
|
+
.Ok(.Bool(true))
|
|
326
|
+
});
|
|
327
|
+
_parse_false_lit :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
|
|
328
|
+
p.advance(); p.advance(); p.advance(); p.advance(); p.advance();
|
|
329
|
+
.Ok(.Bool(false))
|
|
330
|
+
});
|
|
331
|
+
_parse_null_lit :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
|
|
332
|
+
p.advance(); p.advance(); p.advance(); p.advance();
|
|
333
|
+
.Ok(.Null)
|
|
334
|
+
});
|
|
387
335
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
(
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
);
|
|
413
|
-
}
|
|
414
|
-
);
|
|
415
|
-
key_r := self.parse_string();
|
|
416
|
-
match(key_r,
|
|
417
|
-
.Err(e) => { return .Err(e); },
|
|
418
|
-
.Ok(key) => {
|
|
419
|
-
self.skip_ws();
|
|
420
|
-
match(self.expect(u8(58)), // ':'
|
|
421
|
-
.Err(e) => { return .Err(e); },
|
|
422
|
-
.Ok(_) => ()
|
|
423
|
-
);
|
|
424
|
-
match(self.parse_value(),
|
|
425
|
-
.Err(e) => { return .Err(e); },
|
|
426
|
-
.Ok(val) => {
|
|
427
|
-
fields.push(JsonKV(key: key, value: val));
|
|
428
|
-
}
|
|
336
|
+
_parse_value :: (fn(p: _Parser) -> Result(JsonValue, JsonError))({
|
|
337
|
+
p.skip_ws();
|
|
338
|
+
match(p.peek(),
|
|
339
|
+
.None => .Err(.UnexpectedEnd),
|
|
340
|
+
.Some(c) =>
|
|
341
|
+
cond(
|
|
342
|
+
(c == u8(34)) =>
|
|
343
|
+
match(p.parse_string(), .Err(e) => .Err(e), .Ok(s) => .Ok(.Str(s))),
|
|
344
|
+
(c == u8(123)) => { // '{' — parse object
|
|
345
|
+
p.advance();
|
|
346
|
+
keys := ArrayList(String).new();
|
|
347
|
+
vals := ArrayList(JsonValue).new();
|
|
348
|
+
p.skip_ws();
|
|
349
|
+
match(p.peek(),
|
|
350
|
+
.Some(c2) => {
|
|
351
|
+
cond(
|
|
352
|
+
(c2 == u8(125)) => {
|
|
353
|
+
p.advance();
|
|
354
|
+
return .Ok(.Object(keys, vals));
|
|
355
|
+
},
|
|
356
|
+
true => ()
|
|
357
|
+
);
|
|
358
|
+
},
|
|
359
|
+
.None => ()
|
|
429
360
|
);
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
361
|
+
while runtime(true), {
|
|
362
|
+
p.skip_ws();
|
|
363
|
+
match(p.peek(),
|
|
364
|
+
.None => { return .Err(.UnexpectedEnd); },
|
|
365
|
+
.Some(c2) => {
|
|
366
|
+
cond(
|
|
367
|
+
(c2 != u8(34)) => { return .Err(.UnexpectedChar(c2, p.pos)); },
|
|
368
|
+
true => ()
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
);
|
|
372
|
+
key_r := p.parse_string();
|
|
373
|
+
match(key_r,
|
|
374
|
+
.Err(e) => { return .Err(e); },
|
|
375
|
+
.Ok(key) => {
|
|
376
|
+
p.skip_ws();
|
|
377
|
+
match(p.expect(u8(58)),
|
|
378
|
+
.Err(e) => { return .Err(e); },
|
|
379
|
+
.Ok(_) => ()
|
|
380
|
+
);
|
|
381
|
+
match(recur(p),
|
|
382
|
+
.Err(e) => { return .Err(e); },
|
|
383
|
+
.Ok(val) => {
|
|
384
|
+
keys.push(key);
|
|
385
|
+
vals.push(val);
|
|
386
|
+
}
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
);
|
|
390
|
+
p.skip_ws();
|
|
391
|
+
match(p.peek(),
|
|
392
|
+
.Some(c2) => {
|
|
393
|
+
cond(
|
|
394
|
+
(c2 == u8(44)) => { p.advance(); },
|
|
395
|
+
(c2 == u8(125)) => { p.advance(); break; },
|
|
396
|
+
true => { return .Err(.UnexpectedChar(c2, p.pos)); }
|
|
397
|
+
);
|
|
398
|
+
},
|
|
399
|
+
.None => { return .Err(.UnexpectedEnd); }
|
|
400
|
+
);
|
|
401
|
+
};
|
|
402
|
+
.Ok(.Object(keys, vals))
|
|
403
|
+
},
|
|
404
|
+
(c == u8(91)) => { // '[' — parse array
|
|
405
|
+
p.advance();
|
|
406
|
+
items := ArrayList(JsonValue).new();
|
|
407
|
+
p.skip_ws();
|
|
408
|
+
match(p.peek(),
|
|
409
|
+
.Some(c2) => {
|
|
410
|
+
cond(
|
|
411
|
+
(c2 == u8(93)) => {
|
|
412
|
+
p.advance();
|
|
413
|
+
return .Ok(.Array(items));
|
|
414
|
+
},
|
|
415
|
+
true => ()
|
|
416
|
+
);
|
|
417
|
+
},
|
|
418
|
+
.None => ()
|
|
439
419
|
);
|
|
420
|
+
while runtime(true), {
|
|
421
|
+
match(recur(p),
|
|
422
|
+
.Err(e) => { return .Err(e); },
|
|
423
|
+
.Ok(v) => { items.push(v); }
|
|
424
|
+
);
|
|
425
|
+
p.skip_ws();
|
|
426
|
+
match(p.peek(),
|
|
427
|
+
.Some(c2) => {
|
|
428
|
+
cond(
|
|
429
|
+
(c2 == u8(44)) => { p.advance(); },
|
|
430
|
+
(c2 == u8(93)) => { p.advance(); break; },
|
|
431
|
+
true => { return .Err(.UnexpectedChar(c2, p.pos)); }
|
|
432
|
+
);
|
|
433
|
+
},
|
|
434
|
+
.None => { return .Err(.UnexpectedEnd); }
|
|
435
|
+
);
|
|
436
|
+
};
|
|
437
|
+
.Ok(.Array(items))
|
|
440
438
|
},
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
)
|
|
439
|
+
(c == u8(116)) => _parse_true_lit(p),
|
|
440
|
+
(c == u8(102)) => _parse_false_lit(p),
|
|
441
|
+
(c == u8(110)) => _parse_null_lit(p),
|
|
442
|
+
true =>
|
|
443
|
+
match(p.parse_number(), .Err(e) => .Err(e), .Ok(n) => .Ok(.Number(n)))
|
|
444
|
+
)
|
|
445
|
+
)
|
|
446
|
+
});
|
|
447
447
|
|
|
448
448
|
// ============================================================================
|
|
449
449
|
// Public API
|
|
@@ -451,7 +451,7 @@ impl(_Parser,
|
|
|
451
451
|
|
|
452
452
|
json_parse :: (fn(s: str) -> Result(JsonValue, JsonError))({
|
|
453
453
|
p := _Parser.new(s);
|
|
454
|
-
p
|
|
454
|
+
_parse_value(p)
|
|
455
455
|
});
|
|
456
456
|
|
|
457
457
|
export json_parse;
|
|
@@ -472,7 +472,7 @@ _write_str_escaped :: (fn(s: String, out: ArrayList(u8)) -> unit)({
|
|
|
472
472
|
(b == u8(10)) => { out.push(u8(92)); out.push(u8(110)); },
|
|
473
473
|
(b == u8(9)) => { out.push(u8(92)); out.push(u8(116)); },
|
|
474
474
|
(b == u8(13)) => { out.push(u8(92)); out.push(u8(114)); },
|
|
475
|
-
true => out.push(b)
|
|
475
|
+
true => { out.push(b); }
|
|
476
476
|
);
|
|
477
477
|
};
|
|
478
478
|
out.push(u8(34)); // '"'
|
|
@@ -512,25 +512,24 @@ _stringify_into :: (fn(value: JsonValue, out: ArrayList(u8)) -> unit)({
|
|
|
512
512
|
i := usize(0);
|
|
513
513
|
while (i < items.len()), (i = (i + usize(1))), {
|
|
514
514
|
cond(
|
|
515
|
-
(i > usize(0)) => out.push(u8(44))
|
|
515
|
+
(i > usize(0)) => { out.push(u8(44)); },
|
|
516
516
|
true => ()
|
|
517
517
|
);
|
|
518
|
-
|
|
518
|
+
recur(items.get(i).unwrap(), out);
|
|
519
519
|
};
|
|
520
520
|
out.push(u8(93)); // ']'
|
|
521
521
|
},
|
|
522
|
-
.Object(
|
|
522
|
+
.Object(keys, values) => {
|
|
523
523
|
out.push(u8(123)); // '{'
|
|
524
524
|
i := usize(0);
|
|
525
|
-
while (i <
|
|
525
|
+
while (i < keys.len()), (i = (i + usize(1))), {
|
|
526
526
|
cond(
|
|
527
|
-
(i > usize(0)) => out.push(u8(44))
|
|
527
|
+
(i > usize(0)) => { out.push(u8(44)); },
|
|
528
528
|
true => ()
|
|
529
529
|
);
|
|
530
|
-
|
|
531
|
-
_write_str_escaped(kv.key, out);
|
|
530
|
+
_write_str_escaped(keys.get(i).unwrap(), out);
|
|
532
531
|
out.push(u8(58)); // ':'
|
|
533
|
-
|
|
532
|
+
recur(values.get(i).unwrap(), out);
|
|
534
533
|
};
|
|
535
534
|
out.push(u8(125)); // '}'
|
|
536
535
|
}
|
package/std/encoding/utf16.yo
CHANGED
|
@@ -19,7 +19,7 @@ open import "../string";
|
|
|
19
19
|
utf8_to_utf16 :: (fn(s: str) -> ArrayList(u16))({
|
|
20
20
|
out := ArrayList(u16).new();
|
|
21
21
|
i := usize(0);
|
|
22
|
-
while (i < s.len()),
|
|
22
|
+
while (i < s.len()), {
|
|
23
23
|
b0 := u32(s.bytes(i));
|
|
24
24
|
cond(
|
|
25
25
|
(b0 < u32(0x80)) => {
|
|
@@ -66,7 +66,7 @@ export utf8_to_utf16;
|
|
|
66
66
|
utf16_to_utf8 :: (fn(data: ArrayList(u16)) -> Result(String, EncodingError))({
|
|
67
67
|
out := ArrayList(u8).new();
|
|
68
68
|
i := usize(0);
|
|
69
|
-
while (i < data.len()),
|
|
69
|
+
while (i < data.len()), {
|
|
70
70
|
w := u32(data.get(i).unwrap());
|
|
71
71
|
cond(
|
|
72
72
|
// Surrogate pair: high surrogate 0xD800-0xDBFF
|
package/std/fmt/display.yo
CHANGED
package/std/fmt/writer.yo
CHANGED
|
@@ -190,9 +190,7 @@ impl(Writer,
|
|
|
190
190
|
write_padded : (fn(self: Self, s: str, width: usize, pad: rune, align: Alignment) -> Self)({
|
|
191
191
|
len := s.len();
|
|
192
192
|
cond(
|
|
193
|
-
(len >= width) =>
|
|
194
|
-
self.write_str(s)
|
|
195
|
-
},
|
|
193
|
+
(len >= width) => self.write_str(s),
|
|
196
194
|
true => {
|
|
197
195
|
padding := (width - len);
|
|
198
196
|
match(align,
|
|
@@ -240,4 +238,4 @@ impl(Writer,
|
|
|
240
238
|
)
|
|
241
239
|
);
|
|
242
240
|
|
|
243
|
-
export Writer;
|
|
241
|
+
export Writer;
|
package/std/fs/dir.yo
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// std/fs/dir.yo - High-level directory operations
|
|
2
2
|
//
|
|
3
|
-
// Wraps low-level std/
|
|
3
|
+
// Wraps low-level std/sys/dir with typed APIs using Result and IOError.
|
|
4
4
|
//
|
|
5
5
|
// Example:
|
|
6
6
|
// { create_dir, remove_dir, read_dir } :: import "std/fs/dir";
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
{ ArrayList } :: import "../collections/array_list";
|
|
18
18
|
open import "../string";
|
|
19
19
|
{ Path } :: import "../path";
|
|
20
|
-
{ IOError } :: import "../
|
|
21
|
-
IO_dir :: import "../
|
|
22
|
-
IO_file :: import "../
|
|
20
|
+
{ IOError } :: import "../sys/errors";
|
|
21
|
+
IO_dir :: import "../sys/dir";
|
|
22
|
+
IO_file :: import "../sys/file";
|
|
23
23
|
{ platform, Platform } :: import "../process";
|
|
24
24
|
{
|
|
25
25
|
AT_FDCWD, AT_REMOVEDIR, O_RDONLY, O_DIRECTORY,
|
|
26
26
|
DEFAULT_DIR_MODE,
|
|
27
27
|
DT_REG, DT_DIR, DT_LNK
|
|
28
|
-
} :: import "../
|
|
28
|
+
} :: import "../sys/constants";
|
|
29
29
|
|
|
30
30
|
// ============================================================================
|
|
31
31
|
// FileType enum
|
package/std/fs/file.yo
CHANGED
|
@@ -26,16 +26,16 @@
|
|
|
26
26
|
open import "../string";
|
|
27
27
|
open import "../fmt";
|
|
28
28
|
{ Path } :: import "../path";
|
|
29
|
-
{ IOError } :: import "../
|
|
29
|
+
{ IOError } :: import "../sys/errors";
|
|
30
30
|
{ Metadata } :: import "./metadata";
|
|
31
31
|
_metadata_mod :: import "./metadata";
|
|
32
32
|
{ OpenMode, FilePermission, _open_mode_to_flags, _open_mode_needs_perm } :: import "./types";
|
|
33
|
-
IO_file :: import "../
|
|
34
|
-
IO_seek :: import "../
|
|
33
|
+
IO_file :: import "../sys/file";
|
|
34
|
+
IO_seek :: import "../sys/seek";
|
|
35
35
|
{
|
|
36
36
|
AT_FDCWD, O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND,
|
|
37
37
|
O_CLOEXEC, DEFAULT_FILE_MODE
|
|
38
|
-
} :: import "../
|
|
38
|
+
} :: import "../sys/constants";
|
|
39
39
|
|
|
40
40
|
// ============================================================================
|
|
41
41
|
// File
|
|
@@ -112,8 +112,13 @@ impl(File,
|
|
|
112
112
|
fd := self._fd;
|
|
113
113
|
io.async((using(io : IO)) => {
|
|
114
114
|
data_bytes := data.as_bytes();
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
cond(
|
|
116
|
+
(data_bytes.len() == usize(0)) => .Ok(i32(0)),
|
|
117
|
+
true => {
|
|
118
|
+
result := io.await(IO_file.write(fd, data_bytes.ptr().unwrap(), u32(data_bytes.len()), u64(0)));
|
|
119
|
+
IOError.from_result(result)
|
|
120
|
+
}
|
|
121
|
+
)
|
|
117
122
|
})
|
|
118
123
|
}),
|
|
119
124
|
|
|
@@ -121,10 +126,15 @@ impl(File,
|
|
|
121
126
|
// Returns number of bytes written.
|
|
122
127
|
write_bytes : (fn(self: Self, data: ArrayList(u8), using(io : IO)) -> Impl(Future(Result(i32, IOError), IO)))({
|
|
123
128
|
fd := self._fd;
|
|
124
|
-
io.async((using(io : IO)) =>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
129
|
+
io.async((using(io : IO)) =>
|
|
130
|
+
cond(
|
|
131
|
+
(data.len() == usize(0)) => .Ok(i32(0)),
|
|
132
|
+
true => {
|
|
133
|
+
result := io.await(IO_file.write(fd, data.ptr().unwrap(), u32(data.len()), u64(0)));
|
|
134
|
+
IOError.from_result(result)
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
)
|
|
128
138
|
}),
|
|
129
139
|
|
|
130
140
|
// Read the entire file into a byte list.
|
|
@@ -143,9 +153,7 @@ impl(File,
|
|
|
143
153
|
read_err = .Some(IOError.from_errno((i32(0) - n)));
|
|
144
154
|
break;
|
|
145
155
|
},
|
|
146
|
-
(n == i32(0)) =>
|
|
147
|
-
break;
|
|
148
|
-
},
|
|
156
|
+
(n == i32(0)) => break,
|
|
149
157
|
true => {
|
|
150
158
|
offset = (offset + u64(n));
|
|
151
159
|
i := usize(0);
|