grafbase_sdk/extension/
selection_set_resolver.rs1use crate::{
2 component::AnyExtension,
3 types::{ArgumentValues, Configuration, Data, Error, Field, IndexedSchema, SubgraphHeaders, SubgraphSchema},
4};
5
6pub trait SelectionSetResolverExtension: Sized + 'static {
7 fn new(subgraph_schemas: Vec<SubgraphSchema<'_>>, config: Configuration) -> Result<Self, Error>;
8 fn prepare(&mut self, subgraph_name: &str, field: Field<'_>) -> Result<Vec<u8>, Error>;
9 fn resolve(
10 &mut self,
11 headers: SubgraphHeaders,
12 subgraph_name: &str,
13 prepared: &[u8],
14 arguments: ArgumentValues<'_>,
15 ) -> Result<Data, Error>;
16}
17
18#[doc(hidden)]
19pub fn register<T: SelectionSetResolverExtension>() {
20 pub(super) struct Proxy<T: SelectionSetResolverExtension>(T);
21
22 impl<T: SelectionSetResolverExtension> AnyExtension for Proxy<T> {
23 fn selection_set_resolver_prepare(&mut self, subgraph_name: &str, field: Field<'_>) -> Result<Vec<u8>, Error> {
24 self.0.prepare(subgraph_name, field)
25 }
26 fn selection_set_resolver_resolve(
27 &mut self,
28 headers: SubgraphHeaders,
29 subgraph_name: &str,
30 prepared: Vec<u8>,
31 arguments: ArgumentValues<'_>,
32 ) -> Result<Data, Error> {
33 self.0.resolve(headers, subgraph_name, &prepared, arguments)
34 }
35 }
36
37 crate::component::register_extension(Box::new(|subgraph_schemas, config| {
38 let schemas = subgraph_schemas
39 .into_iter()
40 .map(IndexedSchema::from)
41 .collect::<Vec<_>>();
42 <T as SelectionSetResolverExtension>::new(schemas.iter().map(SubgraphSchema).collect(), config)
43 .map(|extension| Box::new(Proxy(extension)) as Box<dyn AnyExtension>)
44 }))
45}