@@ -12,6 +12,11 @@ export interface EditorArrayType {
12
12
elementType : PrimitiveType ;
13
13
}
14
14
15
+ export interface SerializedEditorArrayType
16
+ extends Omit < EditorArrayType , "elementType" > {
17
+ elementType : SerializedPrimitiveType ;
18
+ }
19
+
15
20
export interface EditorTupleType {
16
21
schemaType : "Tuple" ;
17
22
name : string ;
@@ -22,25 +27,127 @@ export interface EditorTupleType {
22
27
} [ ] ;
23
28
}
24
29
30
+ export interface SerializedEditorTupleType
31
+ extends Omit < EditorTupleType , "elements" > {
32
+ elements : {
33
+ name : string | null ;
34
+ type : SerializedPrimitiveType ;
35
+ } [ ] ;
36
+ }
37
+
25
38
export interface EditorRangeType {
26
39
schemaType : "Range" ;
27
40
name : string ;
28
41
elementType : SchemaScalarType ;
29
42
}
30
43
44
+ export interface SerializedEditorRangeType
45
+ extends Omit < EditorRangeType , "elementType" > {
46
+ elementType : string ;
47
+ }
48
+
31
49
export interface EditorMultirangeType {
32
50
schemaType : "Multirange" ;
33
51
name : string ;
34
52
rangeType : EditorRangeType ;
35
53
}
36
54
55
+ export interface SerializedEditorMultirangeType
56
+ extends Omit < EditorMultirangeType , "rangeType" > {
57
+ rangeType : SerializedEditorRangeType ;
58
+ }
59
+
37
60
export type PrimitiveType =
38
61
| SchemaScalarType
39
62
| EditorRangeType
40
63
| EditorMultirangeType
41
64
| EditorArrayType
42
65
| EditorTupleType ;
43
66
67
+ export type SerializedPrimitiveType =
68
+ | string
69
+ | SerializedEditorRangeType
70
+ | SerializedEditorMultirangeType
71
+ | SerializedEditorArrayType
72
+ | SerializedEditorTupleType ;
73
+
74
+ export function serializePrimitiveType (
75
+ type : PrimitiveType
76
+ ) : SerializedPrimitiveType {
77
+ switch ( type . schemaType ) {
78
+ case "Scalar" :
79
+ return type . name ;
80
+ case "Array" :
81
+ return { ...type , elementType : serializePrimitiveType ( type . elementType ) } ;
82
+ case "Tuple" :
83
+ return {
84
+ ...type ,
85
+ elements : type . elements . map ( ( el ) => ( {
86
+ ...el ,
87
+ type : serializePrimitiveType ( el . type ) ,
88
+ } ) ) ,
89
+ } ;
90
+ case "Range" :
91
+ return { ...type , elementType : type . elementType . name } ;
92
+ case "Multirange" :
93
+ return {
94
+ ...type ,
95
+ rangeType : serializePrimitiveType (
96
+ type . rangeType
97
+ ) as SerializedEditorRangeType ,
98
+ } ;
99
+ default :
100
+ assertNever ( type ) ;
101
+ }
102
+ }
103
+
104
+ export function deserializePrimitiveType (
105
+ type : SerializedPrimitiveType ,
106
+ schemaScalars : Map < string , SchemaScalarType >
107
+ ) : PrimitiveType {
108
+ if ( typeof type === "string" ) {
109
+ const scalar = schemaScalars . get ( type ) ;
110
+ if ( ! scalar )
111
+ throw new Error (
112
+ `failed to deserialize primitive type: could not find schema type for scalar '${ type } '`
113
+ ) ;
114
+ return scalar ;
115
+ }
116
+ switch ( type . schemaType ) {
117
+ case "Array" :
118
+ return {
119
+ ...type ,
120
+ elementType : deserializePrimitiveType ( type . elementType , schemaScalars ) ,
121
+ } ;
122
+ case "Tuple" :
123
+ return {
124
+ ...type ,
125
+ elements : type . elements . map ( ( el ) => ( {
126
+ ...el ,
127
+ type : deserializePrimitiveType ( el . type , schemaScalars ) ,
128
+ } ) ) ,
129
+ } ;
130
+ case "Range" :
131
+ return {
132
+ ...type ,
133
+ elementType : deserializePrimitiveType (
134
+ type . elementType ,
135
+ schemaScalars
136
+ ) as SchemaScalarType ,
137
+ } ;
138
+ case "Multirange" :
139
+ return {
140
+ ...type ,
141
+ rangeType : deserializePrimitiveType (
142
+ type . rangeType ,
143
+ schemaScalars
144
+ ) as EditorRangeType ,
145
+ } ;
146
+ default :
147
+ assertNever ( type ) ;
148
+ }
149
+ }
150
+
44
151
export interface EditorRangeValue {
45
152
lower : string | null ;
46
153
upper : string | null ;
0 commit comments