@@ -11,6 +11,7 @@ use core::fmt::Write;
11
11
12
12
use shared:: get_gql_type;
13
13
use tg_schema:: EffectType ;
14
+ use typegraph:: TypeNodeExt as _;
14
15
15
16
use crate :: interlude:: * ;
16
17
use crate :: * ;
@@ -91,7 +92,7 @@ impl crate::Plugin for Generator {
91
92
out. insert (
92
93
self . config . base . path . join ( "client.py" ) ,
93
94
GeneratedFile {
94
- contents : render_client_py ( & self . config , tg) ?,
95
+ contents : render_client_py ( & self . config , tg. clone ( ) ) ?,
95
96
overwrite : true ,
96
97
} ,
97
98
) ;
@@ -100,7 +101,7 @@ impl crate::Plugin for Generator {
100
101
}
101
102
}
102
103
103
- fn render_client_py ( _config : & ClienPyGenConfig , tg : & Typegraph ) -> anyhow:: Result < String > {
104
+ fn render_client_py ( _config : & ClienPyGenConfig , tg : Arc < Typegraph > ) -> anyhow:: Result < String > {
104
105
let mut client_py = GenDestBuf {
105
106
buf : Default :: default ( ) ,
106
107
} ;
@@ -118,17 +119,17 @@ fn render_client_py(_config: &ClienPyGenConfig, tg: &Typegraph) -> anyhow::Resul
118
119
render_static ( & mut client_py) ?;
119
120
120
121
let dest: & mut GenDestBuf = & mut client_py;
121
- let manifest = get_manifest ( tg) ?;
122
+ let manifest = get_manifest ( & tg) ?;
122
123
123
124
let name_mapper = NameMapper {
124
- nodes : tg. types . iter ( ) . cloned ( ) . map ( Rc :: new ) . collect ( ) ,
125
+ tg : tg. clone ( ) ,
125
126
memo : Default :: default ( ) ,
126
127
} ;
127
- let name_mapper = Rc :: new ( name_mapper) ;
128
+ let name_mapper = Arc :: new ( name_mapper) ;
128
129
129
130
let ( node_metas, named_types) = render_node_metas ( dest, & manifest, name_mapper. clone ( ) ) ?;
130
131
let data_types = render_data_types ( dest, & manifest, name_mapper. clone ( ) ) ?;
131
- let data_types = Rc :: new ( data_types) ;
132
+ let data_types = Arc :: new ( data_types) ;
132
133
let selection_names =
133
134
render_selection_types ( dest, & manifest, data_types. clone ( ) , name_mapper. clone ( ) ) ?;
134
135
@@ -139,17 +140,18 @@ class QueryGraph(QueryGraphBase):
139
140
def __init__(self):
140
141
super().__init__({{"#
141
142
) ?;
142
- for ( & id , ty_name) in name_mapper. memo . borrow ( ) . deref ( ) {
143
- let gql_ty = get_gql_type ( & tg. types , id , false ) ;
143
+ for ( name , ty_name) in name_mapper. memo . borrow ( ) . deref ( ) {
144
+ let gql_ty = get_gql_type ( & tg. named . get ( name ) . unwrap ( ) , false ) ;
144
145
write ! (
145
146
dest,
146
147
r#"
147
148
"{ty_name}": "{gql_ty}","#
148
149
) ?;
149
150
}
150
151
for id in named_types {
151
- let ty_name = & tg. types [ id as usize ] . base ( ) . title ;
152
- let gql_ty = get_gql_type ( & tg. types , id, false ) ;
152
+ let ty = tg. named . get ( & id) . unwrap ( ) ;
153
+ let ty_name = ty. title ( ) ;
154
+ let gql_ty = get_gql_type ( ty, false ) ;
153
155
write ! (
154
156
dest,
155
157
r#"
@@ -166,13 +168,17 @@ class QueryGraph(QueryGraphBase):
166
168
for fun in manifest. root_fns {
167
169
use heck:: ToSnekCase ;
168
170
169
- let node_name = fun. name ;
171
+ let node_name = fun. type_ . name ( ) ;
170
172
let method_name = node_name. to_snek_case ( ) ;
171
- let out_ty_name = data_types. get ( & fun. out_id ) . unwrap ( ) ;
173
+ let out_ty_name = data_types. get ( & fun. type_ . output ( ) . name ( ) ) . unwrap ( ) ;
172
174
173
175
let args_row = match (
174
- fun. in_id . map ( |id| data_types. get ( & id) . unwrap ( ) ) ,
175
- fun. select_ty . map ( |id| selection_names. get ( & id) . unwrap ( ) ) ,
176
+ fun. type_
177
+ . input ( )
178
+ . non_empty ( )
179
+ . map ( |ty| data_types. get ( & ty. name ( ) ) . unwrap ( ) ) ,
180
+ fun. select_ty
181
+ . map ( |name| selection_names. get ( & name) . unwrap ( ) ) ,
176
182
) {
177
183
( Some ( arg_ty) , Some ( select_ty) ) => {
178
184
format ! ( "self, args: typing.Union[{arg_ty}, PlaceholderArgs], select: {select_ty}" )
@@ -184,19 +190,19 @@ class QueryGraph(QueryGraphBase):
184
190
( None , None ) => "self" . into ( ) ,
185
191
} ;
186
192
187
- let args_selection = match ( fun. in_id , fun. select_ty ) {
193
+ let args_selection = match ( fun. type_ . input ( ) . non_empty ( ) , fun. select_ty ) {
188
194
( Some ( _) , Some ( _) ) => "(args, select)" ,
189
195
( Some ( _) , None ) => "args" ,
190
196
( None , Some ( _) ) => "select" ,
191
197
( None , None ) => "True" ,
192
198
} ;
193
199
194
200
let meta_method = node_metas
195
- . get ( & fun. id )
201
+ . get ( & fun. type_ . name ( ) )
196
202
. map ( |str| & str[ ..] )
197
203
. unwrap_or_else ( || "scalar" ) ;
198
204
199
- let node_type = match fun. effect {
205
+ let node_type = match fun. type_ . effect ( ) {
200
206
EffectType :: Read => "QueryNode" ,
201
207
EffectType :: Update | EffectType :: Delete | EffectType :: Create => "MutationNode" ,
202
208
} ;
@@ -231,15 +237,15 @@ fn render_static(dest: &mut GenDestBuf) -> core::fmt::Result {
231
237
fn render_data_types (
232
238
dest : & mut GenDestBuf ,
233
239
manifest : & RenderManifest ,
234
- name_mapper : Rc < NameMapper > ,
240
+ name_mapper : Arc < NameMapper > ,
235
241
) -> anyhow:: Result < NameMemo > {
236
- let mut renderer =
237
- TypeRenderer :: new ( name_mapper. nodes . clone ( ) , Rc :: new ( types:: PyTypeRenderer { } ) ) ;
238
- for & id in & manifest. arg_types {
239
- _ = renderer. render ( id ) ?;
242
+ let tg = name_mapper . tg . clone ( ) ;
243
+ let mut renderer = TypeRenderer :: new ( name_mapper. tg . clone ( ) , Arc :: new ( types:: PyTypeRenderer { } ) ) ;
244
+ for & ty_id in & manifest. arg_types {
245
+ _ = renderer. render ( & tg . named [ & ty_id ] ) ?;
240
246
}
241
- for & id in & manifest. return_types {
242
- _ = renderer. render ( id ) ?;
247
+ for & ty_id in & manifest. return_types {
248
+ _ = renderer. render ( & tg . named [ & ty_id ] ) ?;
243
249
}
244
250
let ( types_ts, name_memo) = renderer. finalize ( ) ;
245
251
writeln ! ( dest. buf, "{}" , types_ts) ?;
@@ -250,17 +256,18 @@ fn render_data_types(
250
256
fn render_selection_types (
251
257
dest : & mut GenDestBuf ,
252
258
manifest : & RenderManifest ,
253
- arg_types_memo : Rc < NameMemo > ,
254
- name_mapper : Rc < NameMapper > ,
259
+ arg_types_memo : Arc < NameMemo > ,
260
+ name_mapper : Arc < NameMapper > ,
255
261
) -> Result < NameMemo > {
262
+ let tg = name_mapper. tg . clone ( ) ;
256
263
let mut renderer = TypeRenderer :: new (
257
- name_mapper. nodes . clone ( ) ,
258
- Rc :: new ( selections:: PyNodeSelectionsRenderer {
264
+ name_mapper. tg . clone ( ) ,
265
+ Arc :: new ( selections:: PyNodeSelectionsRenderer {
259
266
arg_ty_names : arg_types_memo,
260
267
} ) ,
261
268
) ;
262
- for & id in & manifest. selections {
263
- _ = renderer. render ( id ) ?;
269
+ for & ty_id in & manifest. selections {
270
+ _ = renderer. render ( & tg . named [ & ty_id ] ) ?;
264
271
}
265
272
let ( buf, memo) = renderer. finalize ( ) ;
266
273
write ! ( dest, "{buf}" ) ?;
@@ -272,19 +279,20 @@ fn render_selection_types(
272
279
fn render_node_metas (
273
280
dest : & mut GenDestBuf ,
274
281
manifest : & RenderManifest ,
275
- name_mapper : Rc < NameMapper > ,
276
- ) -> Result < ( NameMemo , IndexSet < u32 > ) > {
277
- let named_types = Rc :: new ( std:: sync:: Mutex :: new ( IndexSet :: new ( ) ) ) ;
282
+ name_mapper : Arc < NameMapper > ,
283
+ ) -> Result < ( NameMemo , IndexSet < Arc < str > > ) > {
284
+ let tg = name_mapper. tg . clone ( ) ;
285
+ let named_types = Arc :: new ( std:: sync:: Mutex :: new ( IndexSet :: new ( ) ) ) ;
278
286
let mut renderer = TypeRenderer :: new (
279
- name_mapper. nodes . clone ( ) ,
280
- Rc :: new ( node_metas:: PyNodeMetasRenderer {
287
+ name_mapper. tg . clone ( ) ,
288
+ Arc :: new ( node_metas:: PyNodeMetasRenderer {
281
289
name_mapper,
282
290
named_types : named_types. clone ( ) ,
283
291
input_files : manifest. input_files . clone ( ) ,
284
292
} ) ,
285
293
) ;
286
- for & id in & manifest. node_metas {
287
- _ = renderer. render ( id ) ?;
294
+ for & ty_id in & manifest. node_metas {
295
+ _ = renderer. render ( & tg . named [ & ty_id ] ) ?;
288
296
}
289
297
let ( methods, memo) = renderer. finalize ( ) ;
290
298
write ! (
@@ -299,23 +307,21 @@ class NodeDescs:
299
307
) ?;
300
308
Ok ( (
301
309
memo,
302
- Rc :: try_unwrap ( named_types) . unwrap ( ) . into_inner ( ) . unwrap ( ) ,
310
+ Arc :: try_unwrap ( named_types) . unwrap ( ) . into_inner ( ) . unwrap ( ) ,
303
311
) )
304
312
}
305
313
306
314
struct NameMapper {
307
- nodes : Vec < Rc < TypeNode > > ,
315
+ tg : Arc < Typegraph > ,
308
316
memo : std:: cell:: RefCell < NameMemo > ,
309
317
}
310
318
311
319
impl NameMapper {
312
- pub fn name_for ( & self , id : u32 ) -> Rc < str > {
320
+ pub fn name_for ( & self , ty : & Type ) -> Arc < str > {
313
321
self . memo
314
322
. borrow_mut ( )
315
- . entry ( id)
316
- . or_insert_with ( || {
317
- Rc :: from ( normalize_type_title ( & self . nodes [ id as usize ] . base ( ) . title ) )
318
- } )
323
+ . entry ( ty. name ( ) )
324
+ . or_insert_with ( || Arc :: from ( normalize_type_title ( & ty. title ( ) ) ) )
319
325
. clone ( )
320
326
}
321
327
}
0 commit comments