grafbase_sdk/extension/
selection_set_resolver.rs

1use 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}