@@ -9,7 +9,7 @@ use crate::utils::remove_ext;
9
9
// `TS` trait defines the behavior of your types when generating files.
10
10
// `TS` generates some helper functions for file generator.
11
11
pub trait TS {
12
- fn _register ( manager : & mut DescriptorManager ) -> usize ;
12
+ fn _register ( manager : & mut DescriptorManager , generic_base : bool ) -> usize ;
13
13
// The name of this Rust type in Typescript.
14
14
// u8 -> number
15
15
// f64 -> number
@@ -30,6 +30,7 @@ pub struct DescriptorManager {
30
30
pub descriptors : Vec < Descriptor > ,
31
31
pub id_map : HashMap < TypeId , usize > ,
32
32
tag_map : HashMap < usize , HashMap < String , HashSet < String > > > ,
33
+ generics_map : HashMap < usize , String > ,
33
34
}
34
35
35
36
impl DescriptorManager {
@@ -65,6 +66,10 @@ impl DescriptorManager {
65
66
}
66
67
}
67
68
69
+ pub fn add_generics_map ( & mut self , idx : usize , generics : String ) {
70
+ self . generics_map . insert ( idx, generics) ;
71
+ }
72
+
68
73
pub fn gen_data ( self ) -> Vec < ( String , String ) > {
69
74
let mut result: Vec < ( String , String ) > = vec ! [ ] ;
70
75
let descriptors = & self . descriptors ;
@@ -73,7 +78,15 @@ impl DescriptorManager {
73
78
. enumerate ( )
74
79
. for_each ( |( idx, descriptor) | match descriptor {
75
80
Descriptor :: Interface ( d) => {
81
+ if d. generic . is_some ( ) {
82
+ return ;
83
+ }
76
84
let tag_map = self . tag_map . get ( & idx) . map ( |v| v. iter ( ) . collect :: < Vec < _ > > ( ) ) ;
85
+ let generics = if let Some ( v) = self . generics_map . get ( & idx) {
86
+ format ! ( "<{}>" , v) . to_string ( )
87
+ } else {
88
+ String :: new ( )
89
+ } ;
77
90
let tag_content = {
78
91
if let Some ( tag_map) = tag_map. clone ( ) {
79
92
match tag_map. len ( ) {
@@ -140,10 +153,11 @@ impl DescriptorManager {
140
153
} ) ;
141
154
let fields_string = fields_strings. join ( "\n " ) ;
142
155
let mut content = format ! (
143
- "{}\n {}export interface {} {{\n {}{}\n }}\n " ,
156
+ "{}\n {}export interface {}{} {{\n {}{}\n }}\n " ,
144
157
import_string,
145
158
comments,
146
159
d. ts_name. to_string( ) ,
160
+ generics,
147
161
tag_content,
148
162
fields_string
149
163
) ;
@@ -156,6 +170,9 @@ impl DescriptorManager {
156
170
result. push ( ( d. file_name . to_string ( ) , format ( content) ) )
157
171
}
158
172
Descriptor :: Enum ( e) => {
173
+ if e. generic . is_some ( ) {
174
+ return ;
175
+ }
159
176
let import_deps =
160
177
e. dependencies
161
178
. iter ( )
@@ -252,6 +269,7 @@ pub struct EnumDescriptor {
252
269
pub ts_name : String ,
253
270
pub comments : Vec < String > ,
254
271
pub tag : String ,
272
+ pub generic : Option < usize > ,
255
273
}
256
274
257
275
/// Describe how to generate a ts interface.
@@ -264,6 +282,7 @@ pub struct InterfaceDescriptor {
264
282
pub ts_name : String ,
265
283
pub comments : Vec < String > ,
266
284
pub need_builder : bool ,
285
+ pub generic : Option < usize > ,
267
286
}
268
287
269
288
#[ derive( Debug ) ]
@@ -278,7 +297,7 @@ pub struct FieldDescriptor {
278
297
macro_rules! impl_builtin {
279
298
( $i: ident, $l: literal, $t: literal) => {
280
299
impl TS for $i {
281
- fn _register( manager: & mut DescriptorManager ) -> usize {
300
+ fn _register( manager: & mut DescriptorManager , _generic_base : bool ) -> usize {
282
301
let type_id = TypeId :: of:: <$i>( ) ;
283
302
let descriptor = BuiltinTypeDescriptor {
284
303
ts_name: $l. to_string( ) ,
@@ -311,8 +330,8 @@ impl_builtin!(String, "string", "string");
311
330
impl_builtin ! ( bool , "boolean" , "bool" ) ;
312
331
313
332
impl < T : TS + ' static > TS for Vec < T > {
314
- fn _register ( manager : & mut DescriptorManager ) -> usize {
315
- let idx = T :: _register ( manager) ;
333
+ fn _register ( manager : & mut DescriptorManager , generic_base : bool ) -> usize {
334
+ let idx = T :: _register ( manager, generic_base ) ;
316
335
let type_id = TypeId :: of :: < Self > ( ) ;
317
336
let descriptor = GenericDescriptor {
318
337
dependencies : vec ! [ idx] ,
@@ -333,8 +352,8 @@ impl<T: TS + 'static> TS for Vec<T> {
333
352
}
334
353
335
354
impl < T : TS + ' static > TS for Option < T > {
336
- fn _register ( manager : & mut DescriptorManager ) -> usize {
337
- let idx = T :: _register ( manager) ;
355
+ fn _register ( manager : & mut DescriptorManager , generic_base : bool ) -> usize {
356
+ let idx = T :: _register ( manager, generic_base ) ;
338
357
let type_id = TypeId :: of :: < Self > ( ) ;
339
358
let descriptor = GenericDescriptor {
340
359
dependencies : vec ! [ idx] ,
@@ -354,9 +373,9 @@ impl<T: TS + 'static> TS for Option<T> {
354
373
}
355
374
356
375
impl < T : TS + ' static , E : TS + ' static > TS for Result < T , E > {
357
- fn _register ( manager : & mut DescriptorManager ) -> usize {
358
- let t_idx = T :: _register ( manager) ;
359
- let e_idx = E :: _register ( manager) ;
376
+ fn _register ( manager : & mut DescriptorManager , generic_base : bool ) -> usize {
377
+ let t_idx = T :: _register ( manager, generic_base ) ;
378
+ let e_idx = E :: _register ( manager, generic_base ) ;
360
379
let type_id = TypeId :: of :: < Self > ( ) ;
361
380
let descriptor = GenericDescriptor {
362
381
dependencies : vec ! [ t_idx, e_idx] ,
@@ -376,9 +395,9 @@ where
376
395
K : TS + ' static ,
377
396
V : TS + ' static ,
378
397
{
379
- fn _register ( manager : & mut DescriptorManager ) -> usize {
380
- let k_dep = K :: _register ( manager) ;
381
- let v_dep = V :: _register ( manager) ;
398
+ fn _register ( manager : & mut DescriptorManager , generic_base : bool ) -> usize {
399
+ let k_dep = K :: _register ( manager, generic_base ) ;
400
+ let v_dep = V :: _register ( manager, generic_base ) ;
382
401
let descriptor = GenericDescriptor {
383
402
dependencies : vec ! [ k_dep, v_dep] ,
384
403
ts_name : Self :: _ts_name ( ) ,
@@ -398,9 +417,9 @@ where
398
417
K : TS + ' static ,
399
418
V : TS + ' static ,
400
419
{
401
- fn _register ( manager : & mut DescriptorManager ) -> usize {
402
- let k_dep = K :: _register ( manager) ;
403
- let v_dep = V :: _register ( manager) ;
420
+ fn _register ( manager : & mut DescriptorManager , generic_base : bool ) -> usize {
421
+ let k_dep = K :: _register ( manager, generic_base ) ;
422
+ let v_dep = V :: _register ( manager, generic_base ) ;
404
423
let descriptor = GenericDescriptor {
405
424
dependencies : vec ! [ k_dep, v_dep] ,
406
425
ts_name : Self :: _ts_name ( ) ,
0 commit comments