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}