Skip to content

Commit 37205d8

Browse files
committed
wip: use in metagen
1 parent 0789ce0 commit 37205d8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2712
-2213
lines changed

Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/meta-cli/src/cli/gen.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,9 @@ impl InputResolver for MetagenCtx {
171171
})
172172
.await?;
173173

174-
GeneratorInputResolved::TypegraphFromTypegate { raw }
174+
GeneratorInputResolved::TypegraphFromTypegate {
175+
raw: Arc::new(raw.into()),
176+
}
175177
}
176178
GeneratorInputOrder::TypegraphFromPath { path, name } => {
177179
let config = self.config.clone();
@@ -193,7 +195,9 @@ impl InputResolver for MetagenCtx {
193195
)
194196
.await?;
195197

196-
GeneratorInputResolved::TypegraphFromTypegate { raw }
198+
GeneratorInputResolved::TypegraphFromTypegate {
199+
raw: Arc::new(raw.into()),
200+
}
197201
}
198202
GeneratorInputOrder::LoadFdkTemplate {
199203
default,

src/metagen/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ path = "src/lib.rs"
1111

1212
[dependencies]
1313
tg_schema.workspace = true
14+
typegraph.workspace = true
1415

1516
# logging
1617
log.workspace = true

src/metagen/src/client_py/mod.rs

Lines changed: 50 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use core::fmt::Write;
1111

1212
use shared::get_gql_type;
1313
use tg_schema::EffectType;
14+
use typegraph::TypeNodeExt as _;
1415

1516
use crate::interlude::*;
1617
use crate::*;
@@ -91,7 +92,7 @@ impl crate::Plugin for Generator {
9192
out.insert(
9293
self.config.base.path.join("client.py"),
9394
GeneratedFile {
94-
contents: render_client_py(&self.config, tg)?,
95+
contents: render_client_py(&self.config, tg.clone())?,
9596
overwrite: true,
9697
},
9798
);
@@ -100,7 +101,7 @@ impl crate::Plugin for Generator {
100101
}
101102
}
102103

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> {
104105
let mut client_py = GenDestBuf {
105106
buf: Default::default(),
106107
};
@@ -118,17 +119,17 @@ fn render_client_py(_config: &ClienPyGenConfig, tg: &Typegraph) -> anyhow::Resul
118119
render_static(&mut client_py)?;
119120

120121
let dest: &mut GenDestBuf = &mut client_py;
121-
let manifest = get_manifest(tg)?;
122+
let manifest = get_manifest(&tg)?;
122123

123124
let name_mapper = NameMapper {
124-
nodes: tg.types.iter().cloned().map(Rc::new).collect(),
125+
tg: tg.clone(),
125126
memo: Default::default(),
126127
};
127-
let name_mapper = Rc::new(name_mapper);
128+
let name_mapper = Arc::new(name_mapper);
128129

129130
let (node_metas, named_types) = render_node_metas(dest, &manifest, name_mapper.clone())?;
130131
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);
132133
let selection_names =
133134
render_selection_types(dest, &manifest, data_types.clone(), name_mapper.clone())?;
134135

@@ -139,17 +140,18 @@ class QueryGraph(QueryGraphBase):
139140
def __init__(self):
140141
super().__init__({{"#
141142
)?;
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);
144145
write!(
145146
dest,
146147
r#"
147148
"{ty_name}": "{gql_ty}","#
148149
)?;
149150
}
150151
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);
153155
write!(
154156
dest,
155157
r#"
@@ -166,13 +168,17 @@ class QueryGraph(QueryGraphBase):
166168
for fun in manifest.root_fns {
167169
use heck::ToSnekCase;
168170

169-
let node_name = fun.name;
171+
let node_name = fun.type_.name();
170172
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();
172174

173175
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()),
176182
) {
177183
(Some(arg_ty), Some(select_ty)) => {
178184
format!("self, args: typing.Union[{arg_ty}, PlaceholderArgs], select: {select_ty}")
@@ -184,19 +190,19 @@ class QueryGraph(QueryGraphBase):
184190
(None, None) => "self".into(),
185191
};
186192

187-
let args_selection = match (fun.in_id, fun.select_ty) {
193+
let args_selection = match (fun.type_.input().non_empty(), fun.select_ty) {
188194
(Some(_), Some(_)) => "(args, select)",
189195
(Some(_), None) => "args",
190196
(None, Some(_)) => "select",
191197
(None, None) => "True",
192198
};
193199

194200
let meta_method = node_metas
195-
.get(&fun.id)
201+
.get(&fun.type_.name())
196202
.map(|str| &str[..])
197203
.unwrap_or_else(|| "scalar");
198204

199-
let node_type = match fun.effect {
205+
let node_type = match fun.type_.effect() {
200206
EffectType::Read => "QueryNode",
201207
EffectType::Update | EffectType::Delete | EffectType::Create => "MutationNode",
202208
};
@@ -231,15 +237,15 @@ fn render_static(dest: &mut GenDestBuf) -> core::fmt::Result {
231237
fn render_data_types(
232238
dest: &mut GenDestBuf,
233239
manifest: &RenderManifest,
234-
name_mapper: Rc<NameMapper>,
240+
name_mapper: Arc<NameMapper>,
235241
) -> 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])?;
240246
}
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])?;
243249
}
244250
let (types_ts, name_memo) = renderer.finalize();
245251
writeln!(dest.buf, "{}", types_ts)?;
@@ -250,17 +256,18 @@ fn render_data_types(
250256
fn render_selection_types(
251257
dest: &mut GenDestBuf,
252258
manifest: &RenderManifest,
253-
arg_types_memo: Rc<NameMemo>,
254-
name_mapper: Rc<NameMapper>,
259+
arg_types_memo: Arc<NameMemo>,
260+
name_mapper: Arc<NameMapper>,
255261
) -> Result<NameMemo> {
262+
let tg = name_mapper.tg.clone();
256263
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 {
259266
arg_ty_names: arg_types_memo,
260267
}),
261268
);
262-
for &id in &manifest.selections {
263-
_ = renderer.render(id)?;
269+
for &ty_id in &manifest.selections {
270+
_ = renderer.render(&tg.named[&ty_id])?;
264271
}
265272
let (buf, memo) = renderer.finalize();
266273
write!(dest, "{buf}")?;
@@ -272,19 +279,20 @@ fn render_selection_types(
272279
fn render_node_metas(
273280
dest: &mut GenDestBuf,
274281
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()));
278286
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 {
281289
name_mapper,
282290
named_types: named_types.clone(),
283291
input_files: manifest.input_files.clone(),
284292
}),
285293
);
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])?;
288296
}
289297
let (methods, memo) = renderer.finalize();
290298
write!(
@@ -299,23 +307,21 @@ class NodeDescs:
299307
)?;
300308
Ok((
301309
memo,
302-
Rc::try_unwrap(named_types).unwrap().into_inner().unwrap(),
310+
Arc::try_unwrap(named_types).unwrap().into_inner().unwrap(),
303311
))
304312
}
305313

306314
struct NameMapper {
307-
nodes: Vec<Rc<TypeNode>>,
315+
tg: Arc<Typegraph>,
308316
memo: std::cell::RefCell<NameMemo>,
309317
}
310318

311319
impl NameMapper {
312-
pub fn name_for(&self, id: u32) -> Rc<str> {
320+
pub fn name_for(&self, ty: &Type) -> Arc<str> {
313321
self.memo
314322
.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())))
319325
.clone()
320326
}
321327
}

0 commit comments

Comments
 (0)