-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.ts
85 lines (72 loc) · 1.95 KB
/
types.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
export interface StringTransformer {
encode: (value: string) => Uint8Array;
decode: (value: Uint8Array) => string;
}
export type RelateRule =
| RelateRuleNumber
| RelateRuleMultiByteNumber
| RelateRuleBigInt
| RelateRuleString
| RelateRuleObject
| RelateRuleArray;
export interface RelateRuleNumber {
type:
| "i8"
| "u8";
}
export interface RelateRuleMultiByteNumber {
type:
| "f64"
| "f32"
| "i32"
| "u32"
| "i16"
| "u16";
littleEndian?: boolean;
}
export interface RelateRuleBigInt {
type: "i64" | "u64";
littleEndian?: boolean;
}
export interface RelateRuleString {
type: "string";
size: number;
transformer?: StringTransformer;
}
export interface RelateRuleObject {
type: "object";
of: RelateEntries;
}
export type RelateEntries = RelateEntry[] | ReadonlyArray<RelateEntry>;
export type RelateEntry = { name: string } & RelateRule;
export interface RelateRuleArray {
type: "array";
size: number;
of: RelateRule;
}
type MergeObject<TObj> = { [key in keyof TObj]: TObj[key] };
// deno-lint-ignore ban-types
type DeepWritable<T> = T extends Function ? T : T extends {} ? {
-readonly [P in keyof T]: DeepWritable<T[P]>;
}
: T;
// https://stackoverflow.com/a/50375286
// deno-lint-ignore no-explicit-any
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends
((k: infer I) => void) ? I : never;
type DecodeEntries<T> = MergeObject<
UnionToIntersection<
DeepWritable<T> extends (infer R)[] ? DecodeEntry<R> : never
>
>;
type DecodeEntry<T> = T extends RelateEntry
? { [prop in T["name"] & PropertyKey]: DecodeRule<T> }
: never;
export type DecodeRule<T extends RelateRule> = T extends RelateRuleNumber
? number
: T extends RelateRuleMultiByteNumber ? number
: T extends RelateRuleBigInt ? bigint
: T extends RelateRuleString ? string
: T extends RelateRuleObject ? DecodeEntries<T["of"]>
: T extends RelateRuleArray ? DecodeRule<T["of"]>[]
: never;