Skip to content

Commit e90c355

Browse files
committed
Add S.uint8Array
1 parent 2f1112d commit e90c355

File tree

12 files changed

+161
-30
lines changed

12 files changed

+161
-30
lines changed

IDEAS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- Update Standard Schema error message to only include reason part
99
- Fix refinement on union schema which also uses `S.to`
1010
- TS API: Removed `S.transform` in favor of `S.to`
11+
- Add `S.uint8Array` and `S.enableUint8Array`
1112

1213
### TS
1314

docs/js-usage.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ Enable the schemas you need at the project root:
374374
```ts
375375
S.enableJson();
376376
S.enableJsonString();
377+
S.enableUint8Array();
377378
```
378379

379380
And use them as usual:
@@ -386,18 +387,21 @@ And use them as usual:
386387
S.json;
387388

388389
// JSON string
389-
390390
// Asserts that the input is a valid JSON string
391391
S.jsonString;
392392
S.jsonStringWithSpace(2);
393-
394393
// Parses JSON string and validates that it's a number
395394
// JSON string -> number
396395
S.jsonString.with(S.to, S.number);
397-
398396
// Serializes number to JSON string
399-
// number -> JSON string
400397
S.number.with(S.to, S.jsonString);
398+
399+
// Asserts that the input is an instance of Uint8Array
400+
S.uint8Array;
401+
// Decodes Uint8Array to utf-8 string
402+
S.uint8Array.with(S.to, S.string);
403+
// Encodes utf-8 string to Uint8Array
404+
S.string.with(S.to, S.uint8Array);
401405
```
402406

403407
## Strings

packages/sury/scripts/pack/Pack.res

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ let filesMapping = [
119119
("number", "S.float"),
120120
("bigint", "S.bigint"),
121121
("symbol", "S.symbol"),
122-
("json", "S.json"),
123122
("never", "S.never"),
124123
("unknown", "S.unknown"),
125124
("any", "S.unknown"),
@@ -130,8 +129,13 @@ let filesMapping = [
130129
("instance", "S.instance"),
131130
("unnest", "S.unnest"),
132131
("record", "S.dict"),
132+
("json", "S.json"),
133+
("enableJson", "S.enableJson"),
133134
("jsonString", "S.jsonString"),
135+
("enableJsonString", "S.enableJsonString"),
134136
("jsonStringWithSpace", "S.jsonStringWithSpace"),
137+
("uint8Array", "S.uint8Array"),
138+
("enableUint8Array", "S.enableUint8Array"),
135139
("union", "S.js_union"),
136140
("object", "S.object"),
137141
("schema", "S.js_schema"),
@@ -174,8 +178,6 @@ let filesMapping = [
174178
("pattern", "S.pattern"),
175179
("datetime", "S.datetime"),
176180
("trim", "S.trim"),
177-
("enableJson", "S.enableJson"),
178-
("enableJsonString", "S.enableJsonString"),
179181
("global", "S.global"),
180182
("brand", "S.brand"),
181183
]

packages/sury/scripts/pack/Pack.res.mjs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,6 @@ let filesMapping = [
8181
"symbol",
8282
"S.symbol"
8383
],
84-
[
85-
"json",
86-
"S.json"
87-
],
8884
[
8985
"never",
9086
"S.never"
@@ -125,14 +121,34 @@ let filesMapping = [
125121
"record",
126122
"S.dict"
127123
],
124+
[
125+
"json",
126+
"S.json"
127+
],
128+
[
129+
"enableJson",
130+
"S.enableJson"
131+
],
128132
[
129133
"jsonString",
130134
"S.jsonString"
131135
],
136+
[
137+
"enableJsonString",
138+
"S.enableJsonString"
139+
],
132140
[
133141
"jsonStringWithSpace",
134142
"S.jsonStringWithSpace"
135143
],
144+
[
145+
"uint8Array",
146+
"S.uint8Array"
147+
],
148+
[
149+
"enableUint8Array",
150+
"S.enableUint8Array"
151+
],
136152
[
137153
"union",
138154
"S.js_union"
@@ -301,14 +317,6 @@ let filesMapping = [
301317
"trim",
302318
"S.trim"
303319
],
304-
[
305-
"enableJson",
306-
"S.enableJson"
307-
],
308-
[
309-
"enableJsonString",
310-
"S.enableJsonString"
311-
],
312320
[
313321
"global",
314322
"S.global"

packages/sury/src/S.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,9 @@ export const jsonString: Schema<string, string>;
449449
export const jsonStringWithSpace: (space: number) => Schema<string, string>;
450450
export function enableJsonString(): void;
451451

452+
export const uint8Array: Schema<Uint8Array, Uint8Array>;
453+
export function enableUint8Array(): void;
454+
452455
export function safe<Value>(scope: () => Value): Result<Value>;
453456
export function safeAsync<Value>(
454457
scope: () => Promise<Value>

packages/sury/src/S.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ export var int32 = S.int
88
export var number = S.float
99
export var bigint = S.bigint
1010
export var symbol = S.symbol
11-
export var json = S.json
1211
export var never = S.never
1312
export var unknown = S.unknown
1413
export var any = S.unknown
@@ -19,8 +18,13 @@ export var array = S.array
1918
export var instance = S.instance
2019
export var unnest = S.unnest
2120
export var record = S.dict
21+
export var json = S.json
22+
export var enableJson = S.enableJson
2223
export var jsonString = S.jsonString
24+
export var enableJsonString = S.enableJsonString
2325
export var jsonStringWithSpace = S.jsonStringWithSpace
26+
export var uint8Array = S.uint8Array
27+
export var enableUint8Array = S.enableUint8Array
2428
export var union = S.js_union
2529
export var object = S.object
2630
export var schema = S.js_schema
@@ -63,7 +67,5 @@ export var url = S.url
6367
export var pattern = S.pattern
6468
export var datetime = S.datetime
6569
export var trim = S.trim
66-
export var enableJson = S.enableJson
67-
export var enableJsonString = S.enableJsonString
6870
export var global = S.global
6971
export var brand = S.brand

packages/sury/src/S.res.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ let jsonStringWithSpace = Sury.jsonStringWithSpace;
3838

3939
let enableJsonString = Sury.enableJsonString;
4040

41+
let uint8Array = Sury.uint8Array;
42+
43+
let enableUint8Array = Sury.enableUint8Array;
44+
4145
let literal = Sury.literal;
4246

4347
let array = Sury.array;
@@ -201,6 +205,8 @@ export {
201205
jsonString,
202206
jsonStringWithSpace,
203207
enableJsonString,
208+
uint8Array,
209+
enableUint8Array,
204210
literal,
205211
array,
206212
unnest,

packages/sury/src/S.resi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ let jsonString: t<string>
301301
let jsonStringWithSpace: int => t<string>
302302
let enableJsonString: unit => unit
303303

304+
let uint8Array: t<Uint8Array.t>
305+
let enableUint8Array: unit => unit
306+
304307
let literal: 'value => t<'value>
305308
let array: t<'value> => t<array<'value>>
306309
let unnest: t<'value> => t<array<'value>>

packages/sury/src/Sury.res

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,13 +1891,12 @@ let rec parse = (prevB: b, ~schema, ~input as inputArg: val, ~path) => {
18911891
}
18921892
}
18931893

1894-
if isUnsupported.contents {
1895-
b->B.unsupportedTransform(~from=input.contents->Obj.magic, ~target=schema, ~path)
1896-
}
1897-
18981894
switch schema.compiler {
18991895
| Some(compiler) => input := compiler(b, ~input=input.contents, ~selfSchema=schema, ~path)
1900-
| None => ()
1896+
| None =>
1897+
if isUnsupported.contents {
1898+
b->B.unsupportedTransform(~from=input.contents->Obj.magic, ~target=schema, ~path)
1899+
}
19011900
}
19021901

19031902
if input.contents.skipTo !== Some(true) {
@@ -3720,6 +3719,45 @@ let jsonStringWithSpace = (space: int) => {
37203719
mut->castToPublic
37213720
}
37223721

3722+
let uint8Array = shaken("uint8Array")
3723+
3724+
let enableUint8Array = () => {
3725+
if uint8Array->Obj.magic->Js.Dict.unsafeGet(shakenRef)->Obj.magic {
3726+
let _ = %raw(`delete uint8Array.as`)
3727+
uint8Array.tag = Instance
3728+
uint8Array.class = %raw(`Uint8Array`)
3729+
uint8Array.compiler = Some(
3730+
Builder.make((b, ~input as inputArg, ~selfSchema, ~path as _) => {
3731+
let inputTagFlag = inputArg.tag->TagFlag.get
3732+
let input = ref(inputArg)
3733+
3734+
if inputTagFlag->Flag.unsafeHas(TagFlag.string) {
3735+
input :=
3736+
b->B.val(
3737+
`${b->B.embed(%raw(`new TextEncoder()`))}.encode(${input.contents.inline})`,
3738+
~schema=uint8Array,
3739+
)
3740+
}
3741+
3742+
switch selfSchema {
3743+
| {to, parser: ?None} => {
3744+
let toTagFlag = to.tag->TagFlag.get
3745+
if toTagFlag->Flag.unsafeHas(TagFlag.string) {
3746+
input :=
3747+
b->B.val(
3748+
`${b->B.embed(%raw(`new TextDecoder()`))}.decode(${input.contents.inline})`,
3749+
~schema=string,
3750+
)
3751+
}
3752+
input.contents
3753+
}
3754+
| _ => input.contents
3755+
}
3756+
}),
3757+
)
3758+
}
3759+
}
3760+
37233761
module Int = {
37243762
module Refinement = {
37253763
type kind =
@@ -6297,6 +6335,7 @@ let length = (schema, length, ~message as maybeMessage=?) => {
62976335
let unknown: t<unknown> = unknown->castToPublic
62986336
let json: t<Js.Json.t> = json->castToPublic
62996337
let jsonString: t<string> = jsonString->castToPublic
6338+
let uint8Array: t<Uint8Array.t> = uint8Array->castToPublic
63006339
let bool: t<bool> = bool->castToPublic
63016340
let symbol: t<Js.Types.symbol> = symbol->castToPublic
63026341
let string: t<string> = string->castToPublic

packages/sury/src/Sury.res.mjs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,12 +1103,11 @@ function parse(prevB, schema, inputArg, path) {
11031103
}
11041104

11051105
}
1106-
if (isUnsupported) {
1107-
unsupportedTransform(b, input, schema, path);
1108-
}
11091106
let compiler = schema.compiler;
11101107
if (compiler !== undefined) {
11111108
input = compiler(b, input, schema, path);
1109+
} else if (isUnsupported) {
1110+
unsupportedTransform(b, input, schema, path);
11121111
}
11131112
if (input.t !== true) {
11141113
let refiner = schema.refiner;
@@ -2491,6 +2490,38 @@ function jsonStringWithSpace(space) {
24912490
return mut;
24922491
}
24932492

2493+
let uint8Array = shaken("uint8Array");
2494+
2495+
function enableUint8Array() {
2496+
if (uint8Array[shakenRef]) {
2497+
((delete uint8Array.as));
2498+
uint8Array.type = "instance";
2499+
uint8Array.class = (Uint8Array);
2500+
uint8Array.compiler = (b, inputArg, selfSchema, param) => {
2501+
let inputTagFlag = flags[inputArg.type];
2502+
let input = inputArg;
2503+
if (inputTagFlag & 2) {
2504+
input = val(b, embed(b, (new TextEncoder())) + ".encode(" + input.i + ")", uint8Array);
2505+
}
2506+
let match = selfSchema.parser;
2507+
if (match !== undefined) {
2508+
return input;
2509+
}
2510+
let to = selfSchema.to;
2511+
if (to === undefined) {
2512+
return input;
2513+
}
2514+
let toTagFlag = flags[to.type];
2515+
if (toTagFlag & 2) {
2516+
input = val(b, embed(b, (new TextDecoder())) + ".decode(" + input.i + ")", string);
2517+
}
2518+
return input;
2519+
};
2520+
return;
2521+
}
2522+
2523+
}
2524+
24942525
let metadataId$2 = "m:Int.refinements";
24952526

24962527
function refinements$2(schema) {
@@ -4514,6 +4545,8 @@ export {
45144545
jsonString,
45154546
jsonStringWithSpace,
45164547
enableJsonString,
4548+
uint8Array,
4549+
enableUint8Array,
45174550
literal,
45184551
array,
45194552
unnest,

0 commit comments

Comments
 (0)