Skip to content

Commit d42512a

Browse files
authored
Merge pull request #22 from mojotech/em/cleanups-and-additions
Cleanups and Additions
2 parents ca1de36 + 83884e9 commit d42512a

File tree

10 files changed

+502
-503
lines changed

10 files changed

+502
-503
lines changed

docs/classes/_decoder_.decoder.md

Lines changed: 201 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Alternatively, the main decoder `run()` method returns an object of type `Result
3939
* [constant](_decoder_.decoder.md#constant)
4040
* [dict](_decoder_.decoder.md#dict)
4141
* [fail](_decoder_.decoder.md#fail)
42+
* [intersection](_decoder_.decoder.md#intersection)
4243
* [lazy](_decoder_.decoder.md#lazy)
4344
* [number](_decoder_.decoder.md#number)
4445
* [object](_decoder_.decoder.md#object)
@@ -83,15 +84,15 @@ ___
8384
**● decode**: *`function`*
8485

8586
#### Type declaration
86-
▸(json: *`any`*): `Result.Result`<`A`, `Partial`<[DecoderError](../interfaces/_decoder_.decodererror.md)>>
87+
▸(json: *`any`*): `DecodeResult`<`A`>
8788

8889
**Parameters:**
8990

9091
| Param | Type |
9192
| ------ | ------ |
9293
| json | `any` |
9394

94-
**Returns:** `Result.Result`<`A`, `Partial`<[DecoderError](../interfaces/_decoder_.decodererror.md)>>
95+
**Returns:** `DecodeResult`<`A`>
9596

9697
___
9798

@@ -178,7 +179,7 @@ ___
178179

179180
### run
180181

181-
**run**(json: *`any`*): `Result.Result`<`A`, [DecoderError](../interfaces/_decoder_.decodererror.md)>
182+
**run**(json: *`any`*): `RunResult`<`A`>
182183

183184
Run the decoder and return a `Result` with either the decoded value or a `DecoderError` containing the json input, the location of the error, and the error message.
184185

@@ -207,7 +208,7 @@ string().run(9001)
207208
| ------ | ------ |
208209
| json | `any` |
209210

210-
**Returns:** `Result.Result`<`A`, [DecoderError](../interfaces/_decoder_.decodererror.md)>
211+
**Returns:** `RunResult`<`A`>
211212

212213
___
213214
<a id="runpromise"></a>
@@ -252,27 +253,18 @@ ___
252253

253254
Decoder identity function. Useful for incremental decoding.
254255

255-
Example:
256-
257-
```
258-
const json: any = [1, true, 2, 3, 'five', 4, []];
259-
const jsonArray: any[] = Result.withDefault([], array(anyJson()).run(json));
260-
const numbers: number[] = Result.successes(jsonArray.map(number().run));
261-
262-
numbers
263-
// => [1, 2, 3, 4]
264-
```
265-
266256
**Returns:** [Decoder](_decoder_.decoder.md)<`any`>
267257

268258
___
269259
<a id="array"></a>
270260

271261
### `<Static>` array
272262

263+
**array**(): [Decoder](_decoder_.decoder.md)<`any`[]>
264+
273265
**array**A(decoder: *[Decoder](_decoder_.decoder.md)<`A`>*): [Decoder](_decoder_.decoder.md)<`A`[]>
274266

275-
Decoder for json arrays. Runs `decoder` on each array element, and succeeds if all elements are successfully decoded.
267+
Decoder for json arrays. Runs `decoder` on each array element, and succeeds if all elements are successfully decoded. If no `decoder` argument is provided then the outer array part of the json is validated but not the contents, typing the result as `any[]`.
276268

277269
To decode a single value that is inside of an array see `valueAt`.
278270

@@ -284,8 +276,23 @@ array(number()).run([1, 2, 3])
284276
285277
array(array(boolean())).run([[true], [], [true, false, false]])
286278
// => {ok: true, result: [[true], [], [true, false, false]]}
279+
280+
const validNumbersDecoder = array()
281+
.map((arr: any[]) => arr.map(number().run))
282+
.map(Result.successes)
283+
284+
validNumbersDecoder.run([1, true, 2, 3, 'five', 4, []])
285+
// {ok: true, result: [1, 2, 3, 4]}
286+
287+
validNumbersDecoder.run([false, 'hi', {}])
288+
// {ok: true, result: []}
289+
290+
validNumbersDecoder.run(false)
291+
// {ok: false, error: {..., message: "expected an array, got a boolean"}}
287292
```
288293

294+
**Returns:** [Decoder](_decoder_.decoder.md)<`any`[]>
295+
289296
**Type parameters:**
290297

291298
#### A
@@ -456,6 +463,176 @@ Decoder that ignores the input json and always fails with `errorMessage`.
456463

457464
**Returns:** [Decoder](_decoder_.decoder.md)<`A`>
458465

466+
___
467+
<a id="intersection"></a>
468+
469+
### `<Static>` intersection
470+
471+
**intersection**A,B(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*): [Decoder](_decoder_.decoder.md)< `A` & `B`>
472+
473+
**intersection**A,B,C(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*, cd: *[Decoder](_decoder_.decoder.md)<`C`>*): [Decoder](_decoder_.decoder.md)< `A` & `B` & `C`>
474+
475+
**intersection**A,B,C,D(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*, cd: *[Decoder](_decoder_.decoder.md)<`C`>*, dd: *[Decoder](_decoder_.decoder.md)<`D`>*): [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D`>
476+
477+
**intersection**A,B,C,D,E(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*, cd: *[Decoder](_decoder_.decoder.md)<`C`>*, dd: *[Decoder](_decoder_.decoder.md)<`D`>*, ed: *[Decoder](_decoder_.decoder.md)<`E`>*): [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E`>
478+
479+
**intersection**A,B,C,D,E,F(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*, cd: *[Decoder](_decoder_.decoder.md)<`C`>*, dd: *[Decoder](_decoder_.decoder.md)<`D`>*, ed: *[Decoder](_decoder_.decoder.md)<`E`>*, fd: *[Decoder](_decoder_.decoder.md)<`F`>*): [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E` & `F`>
480+
481+
**intersection**A,B,C,D,E,F,G(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*, cd: *[Decoder](_decoder_.decoder.md)<`C`>*, dd: *[Decoder](_decoder_.decoder.md)<`D`>*, ed: *[Decoder](_decoder_.decoder.md)<`E`>*, fd: *[Decoder](_decoder_.decoder.md)<`F`>*, gd: *[Decoder](_decoder_.decoder.md)<`G`>*): [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E` & `F` & `G`>
482+
483+
**intersection**A,B,C,D,E,F,G,H(ad: *[Decoder](_decoder_.decoder.md)<`A`>*, bd: *[Decoder](_decoder_.decoder.md)<`B`>*, cd: *[Decoder](_decoder_.decoder.md)<`C`>*, dd: *[Decoder](_decoder_.decoder.md)<`D`>*, ed: *[Decoder](_decoder_.decoder.md)<`E`>*, fd: *[Decoder](_decoder_.decoder.md)<`F`>*, gd: *[Decoder](_decoder_.decoder.md)<`G`>*, hd: *[Decoder](_decoder_.decoder.md)<`H`>*): [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E` & `F` & `G` & `H`>
484+
485+
Combines 2-8 object decoders into a decoder for the intersection of all the objects.
486+
487+
Example:
488+
489+
```
490+
interface Pet {
491+
name: string;
492+
maxLegs: number;
493+
}
494+
495+
interface Cat extends Pet {
496+
evil: boolean;
497+
}
498+
499+
const petDecoder: Decoder<Pet> = object({name: string(), maxLegs: number()});
500+
const catDecoder: Decoder<Cat> = intersection(petDecoder, object({evil: boolean()}));
501+
```
502+
503+
**Type parameters:**
504+
505+
#### A
506+
#### B
507+
**Parameters:**
508+
509+
| Param | Type |
510+
| ------ | ------ |
511+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
512+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
513+
514+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B`>
515+
516+
**Type parameters:**
517+
518+
#### A
519+
#### B
520+
#### C
521+
**Parameters:**
522+
523+
| Param | Type |
524+
| ------ | ------ |
525+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
526+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
527+
| cd | [Decoder](_decoder_.decoder.md)<`C`> |
528+
529+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B` & `C`>
530+
531+
**Type parameters:**
532+
533+
#### A
534+
#### B
535+
#### C
536+
#### D
537+
**Parameters:**
538+
539+
| Param | Type |
540+
| ------ | ------ |
541+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
542+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
543+
| cd | [Decoder](_decoder_.decoder.md)<`C`> |
544+
| dd | [Decoder](_decoder_.decoder.md)<`D`> |
545+
546+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D`>
547+
548+
**Type parameters:**
549+
550+
#### A
551+
#### B
552+
#### C
553+
#### D
554+
#### E
555+
**Parameters:**
556+
557+
| Param | Type |
558+
| ------ | ------ |
559+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
560+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
561+
| cd | [Decoder](_decoder_.decoder.md)<`C`> |
562+
| dd | [Decoder](_decoder_.decoder.md)<`D`> |
563+
| ed | [Decoder](_decoder_.decoder.md)<`E`> |
564+
565+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E`>
566+
567+
**Type parameters:**
568+
569+
#### A
570+
#### B
571+
#### C
572+
#### D
573+
#### E
574+
#### F
575+
**Parameters:**
576+
577+
| Param | Type |
578+
| ------ | ------ |
579+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
580+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
581+
| cd | [Decoder](_decoder_.decoder.md)<`C`> |
582+
| dd | [Decoder](_decoder_.decoder.md)<`D`> |
583+
| ed | [Decoder](_decoder_.decoder.md)<`E`> |
584+
| fd | [Decoder](_decoder_.decoder.md)<`F`> |
585+
586+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E` & `F`>
587+
588+
**Type parameters:**
589+
590+
#### A
591+
#### B
592+
#### C
593+
#### D
594+
#### E
595+
#### F
596+
#### G
597+
**Parameters:**
598+
599+
| Param | Type |
600+
| ------ | ------ |
601+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
602+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
603+
| cd | [Decoder](_decoder_.decoder.md)<`C`> |
604+
| dd | [Decoder](_decoder_.decoder.md)<`D`> |
605+
| ed | [Decoder](_decoder_.decoder.md)<`E`> |
606+
| fd | [Decoder](_decoder_.decoder.md)<`F`> |
607+
| gd | [Decoder](_decoder_.decoder.md)<`G`> |
608+
609+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E` & `F` & `G`>
610+
611+
**Type parameters:**
612+
613+
#### A
614+
#### B
615+
#### C
616+
#### D
617+
#### E
618+
#### F
619+
#### G
620+
#### H
621+
**Parameters:**
622+
623+
| Param | Type |
624+
| ------ | ------ |
625+
| ad | [Decoder](_decoder_.decoder.md)<`A`> |
626+
| bd | [Decoder](_decoder_.decoder.md)<`B`> |
627+
| cd | [Decoder](_decoder_.decoder.md)<`C`> |
628+
| dd | [Decoder](_decoder_.decoder.md)<`D`> |
629+
| ed | [Decoder](_decoder_.decoder.md)<`E`> |
630+
| fd | [Decoder](_decoder_.decoder.md)<`F`> |
631+
| gd | [Decoder](_decoder_.decoder.md)<`G`> |
632+
| hd | [Decoder](_decoder_.decoder.md)<`H`> |
633+
634+
**Returns:** [Decoder](_decoder_.decoder.md)< `A` & `B` & `C` & `D` & `E` & `F` & `G` & `H`>
635+
459636
___
460637
<a id="lazy"></a>
461638

@@ -506,9 +683,11 @@ ___
506683

507684
### `<Static>` object
508685

686+
**object**(): [Decoder](_decoder_.decoder.md)<`object`>
687+
509688
**object**A(decoders: *[DecoderObject](../modules/_decoder_.md#decoderobject)<`A`>*): [Decoder](_decoder_.decoder.md)<`A`>
510689

511-
An higher-order decoder that runs decoders on specified fields of an object, and returns a new object with those fields.
690+
An higher-order decoder that runs decoders on specified fields of an object, and returns a new object with those fields. If `object` is called with no arguments, then the outer object part of the json is validated but not the contents, typing the result as a dictionary where all keys have a value of type `any`.
512691

513692
The `optional` and `constant` decoders are particularly useful for decoding objects that match typescript interfaces.
514693

@@ -519,8 +698,13 @@ Example:
519698
```
520699
object({x: number(), y: number()}).run({x: 5, y: 10})
521700
// => {ok: true, result: {x: 5, y: 10}}
701+
702+
object().map(Object.keys).run({n: 1, i: [], c: {}, e: 'e'})
703+
// => {ok: true, result: ['n', 'i', 'c', 'e']}
522704
```
523705

706+
**Returns:** [Decoder](_decoder_.decoder.md)<`object`>
707+
524708
**Type parameters:**
525709

526710
#### A

0 commit comments

Comments
 (0)