rusty_gql/
container.rs

1use std::{collections::HashMap, ops::Deref, sync::Arc};
2
3use crate::{
4    error::GqlError,
5    types::schema::{build_schema, Schema},
6    CustomDirective, QueryRoot, SelectionSetResolver,
7};
8
9pub struct ContainerInner<
10    Query: SelectionSetResolver,
11    Mutation: SelectionSetResolver,
12    Subscription: SelectionSetResolver,
13> {
14    pub query_resolvers: QueryRoot<Query>,
15    pub mutation_resolvers: Mutation,
16    pub subscription_resolvers: Subscription,
17    pub schema: Schema,
18}
19
20#[derive(Clone)]
21pub struct Container<
22    Query: SelectionSetResolver,
23    Mutation: SelectionSetResolver,
24    Subscription: SelectionSetResolver,
25>(Arc<ContainerInner<Query, Mutation, Subscription>>);
26
27impl<Query, Mutation, Subscription> Deref for Container<Query, Mutation, Subscription>
28where
29    Query: SelectionSetResolver + 'static,
30    Mutation: SelectionSetResolver + 'static,
31    Subscription: SelectionSetResolver + 'static,
32{
33    type Target = ContainerInner<Query, Mutation, Subscription>;
34
35    fn deref(&self) -> &Self::Target {
36        &self.0
37    }
38}
39
40impl<Query, Mutation, Subscription> Container<Query, Mutation, Subscription>
41where
42    Query: SelectionSetResolver + 'static,
43    Mutation: SelectionSetResolver + 'static,
44    Subscription: SelectionSetResolver + 'static,
45{
46    pub fn new(
47        schema_doc: &[&str],
48        query: Query,
49        mutation: Mutation,
50        subscription: Subscription,
51        custom_directives: HashMap<&'static str, Box<dyn CustomDirective>>,
52    ) -> Result<Self, GqlError> {
53        let schema = build_schema(schema_doc, custom_directives)?;
54        Ok(Container(Arc::new(ContainerInner {
55            query_resolvers: QueryRoot { query },
56            mutation_resolvers: mutation,
57            subscription_resolvers: subscription,
58            schema,
59        })))
60    }
61}