async_graphql/types/
empty_subscription.rs

1use std::{borrow::Cow, pin::Pin};
2
3use futures_util::stream::{self, Stream};
4
5use crate::{Context, Response, ServerError, SubscriptionType, registry};
6
7/// Empty subscription
8///
9/// Only the parameters used to construct the Schema, representing an
10/// unconfigured subscription.
11#[derive(Default, Copy, Clone)]
12pub struct EmptySubscription;
13
14impl SubscriptionType for EmptySubscription {
15    fn type_name() -> Cow<'static, str> {
16        Cow::Borrowed("EmptySubscription")
17    }
18
19    fn create_type_info(registry: &mut registry::Registry) -> String {
20        registry.create_subscription_type::<Self, _>(|_| registry::MetaType::Object {
21            name: "EmptySubscription".to_string(),
22            description: None,
23            fields: Default::default(),
24            cache_control: Default::default(),
25            extends: false,
26            shareable: false,
27            resolvable: true,
28            keys: None,
29            visible: None,
30            inaccessible: false,
31            interface_object: false,
32            tags: Default::default(),
33            is_subscription: true,
34            rust_typename: Some(std::any::type_name::<Self>()),
35            directive_invocations: Default::default(),
36            requires_scopes: Default::default(),
37        })
38    }
39
40    fn is_empty() -> bool {
41        true
42    }
43
44    fn create_field_stream<'a>(
45        &'a self,
46        _ctx: &'a Context<'_>,
47    ) -> Option<Pin<Box<dyn Stream<Item = Response> + Send + 'a>>>
48    where
49        Self: Send + Sync + 'static + Sized,
50    {
51        Some(Box::pin(stream::once(async move {
52            let err = ServerError::new("Schema is not configured for subscription.", None);
53            Response::from_errors(vec![err])
54        })))
55    }
56}