-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathparameters.d.ts
90 lines (76 loc) · 2.54 KB
/
parameters.d.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
86
87
88
89
90
/** This code is copied from the typings in @erichardson-lee/mqtt-router */
//#region Topic Parameter name & type inference
/** Check if a string is a parameter in a type */
type IsParameter<Parameter> = Parameter extends `+${infer ParamName}`
? ParamName
: never | Parameter extends `#${string}`
? Parameter
: never;
/** Type To split by / and extract parameters */
type FilteredTopicSplit<Topic> = Topic extends `${infer PartA}/${infer PartB}`
? IsParameter<PartA> | FilteredTopicSplit<PartB>
: IsParameter<Topic>;
/** Type to get Parameter Value */
type ParameterValue<Parameter> = Parameter extends `#${string}`
? string[]
: string;
/** Type to remove # prefix from parameter */
type StripParameterHash<Parameter> = Parameter extends `#${infer Name}`
? Name
: Parameter;
/** Parameter Type */
export type MqttParameters<Topic> = {
[key in FilteredTopicSplit<Topic> as StripParameterHash<key>]: ParameterValue<key>;
};
//#endregion
//#region Topic Cleaning
/** Clean a segment of a Topic */
type CleanTopicSegment<Segment> = Segment extends `+${string}`
? "+"
: Segment extends `#${string}`
? "#"
: Segment;
/** Clean a Topic (replace #value or +value with # or + respectively) */
export type CleanTopic<Topic> = Topic extends `${infer PartA}/${infer PartB}`
? `${CleanTopicSegment<PartA>}/${CleanTopic<PartB>}`
: CleanTopicSegment<Topic>;
//#endregion
//#region Topic Filling
type JoinPath<Parts extends string[]> = Parts extends [infer v, ...infer rest]
? rest extends []
? v
: v extends string
? rest extends string[]
? `${v}/${JoinPath<rest>}`
: ""
: ""
: "";
type FillParam<
Section extends string,
Parameters extends MqttParameters<FullPattern>,
FullPattern extends string = Section
> = Section extends `+${infer PName}`
? PName extends keyof Parameters
? Parameters[PName] extends string
? Parameters[PName]
: unknown
: unknown
: Section extends `#${infer PName}`
? PName extends keyof Parameters
? Parameters[PName] extends string[]
? JoinPath<Parameters[PName]>
: unknown
: unknown
: Section;
export type FillTopic<
Pattern extends string,
Parameters extends MqttParameters<FullPattern>,
FullPattern extends string = Pattern
> = Pattern extends `${infer Left}/${infer Right}`
? `${FillParam<Left, Parameters, FullPattern>}/${FillTopic<
Right,
Parameters,
FullPattern
>}`
: FillParam<Pattern, Parameters, FullPattern>;
//#endregion