-
Notifications
You must be signed in to change notification settings - Fork 0
/
choose.ts
43 lines (41 loc) · 1.26 KB
/
choose.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import { BufferCodec } from "../types";
import { branch } from "./branch";
/**
* Allows switching between different supplied codecs by name.
*
* @param chooseReadBranch Returns the name of the codec to use for parsing
* @param chooseWriteBranch Returns the name of the codec to use for serializing
* @param branches An object mapping from name to a codec
*
* @example
* // Declare an enum for branch names
* enum Version { V1 = 1, V2 = 2 }
*
* merge(
* // Our codec handles the version number first...
* props({
* version: enumerator<Version>(
* integer.UInt8,
* Object.values(Version) as Version[]
* )
* }),
* // ...and then switches codec for the rest
* choose(
* (buffer, context) => context.version,
* (parsed) => parsed.version,
* {
* [Version.V1]: codecForV1,
* [Version.V2]: codecForV2
* }
* )
* )
*/
export const choose = <T, C extends {}, K extends string | number>(
chooseReadBranch: (buffer: Buffer, context: C) => K,
chooseWriteBranch: (parsed: T & C) => K,
branches: Record<K, BufferCodec<T, C>>
): BufferCodec<T, C> =>
branch(
(buffer, context) => branches[chooseReadBranch(buffer, context)],
(context) => branches[chooseWriteBranch(context)]
);