pub struct SubscriptionDefinition {
pub name: String,
pub return_type: String,
pub arguments: Vec<ArgumentDefinition>,
pub description: Option<String>,
pub topic: Option<String>,
pub filter: Option<SubscriptionFilter>,
pub fields: Vec<String>,
pub filter_fields: Vec<String>,
pub deprecation: Option<DeprecationInfo>,
}Expand description
A subscription definition.
Subscriptions are declarative bindings to event topics.
Fields§
§name: StringSubscription name.
return_type: StringReturn type name.
arguments: Vec<ArgumentDefinition>Arguments.
description: Option<String>Description.
topic: Option<String>Event topic to subscribe to.
filter: Option<SubscriptionFilter>Compiled filter expression for event matching.
Maps argument names to JSONB paths in event data.
Example: {"orderId": "$.id", "status": "$.order_status"}
fields: Vec<String>Fields to project from event data. If empty, all fields are returned.
filter_fields: Vec<String>Shorthand: argument names that should auto-generate argument_paths
entries using /<field_name> as the JSON pointer path.
Example: filter_fields: ["user_id"] generates an argument_paths
entry of "user_id" -> "/user_id" at runtime.
deprecation: Option<DeprecationInfo>Deprecation information (from @deprecated directive). When set, this subscription is marked as deprecated in the schema.
Implementations§
Source§impl SubscriptionDefinition
impl SubscriptionDefinition
Sourcepub fn new(name: impl Into<String>, return_type: impl Into<String>) -> Self
pub fn new(name: impl Into<String>, return_type: impl Into<String>) -> Self
Create a new subscription definition.
Sourcepub fn with_topic(self, topic: impl Into<String>) -> Self
pub fn with_topic(self, topic: impl Into<String>) -> Self
Set the event topic for this subscription.
§Example
use fraiseql_core::schema::SubscriptionDefinition;
let subscription = SubscriptionDefinition::new("orderCreated", "Order")
.with_topic("order_created");
assert_eq!(subscription.topic, Some("order_created".to_string()));Sourcepub fn with_description(self, description: impl Into<String>) -> Self
pub fn with_description(self, description: impl Into<String>) -> Self
Set the description for this subscription.
Sourcepub fn with_argument(self, arg: ArgumentDefinition) -> Self
pub fn with_argument(self, arg: ArgumentDefinition) -> Self
Add an argument to this subscription.
Sourcepub fn with_filter(self, filter: SubscriptionFilter) -> Self
pub fn with_filter(self, filter: SubscriptionFilter) -> Self
Set the filter configuration for event matching.
Sourcepub fn with_fields(self, fields: Vec<String>) -> Self
pub fn with_fields(self, fields: Vec<String>) -> Self
Set the fields to project from event data.
Sourcepub fn filter_violation(&self) -> Option<String>
pub fn filter_violation(&self) -> Option<String>
Describe this subscription’s unresolvable filter references, or None (#1262).
A client sends its variables under the declared GraphQL argument names, so a filter keyed by any other name can never be matched. The delivery loop cannot tell that apart from an unsupplied optional argument, whose condition it skips by design — so the reference does not fail loudly, it fails open: the condition contributes nothing and a subscriber that asked to filter receives every event on the topic.
Checked against the post-expansion key set, since filter_fields entries
become argument_paths entries at subscribe time and dangle the same way.
One function so the compiler, the schema load and the subscribe path all refuse the same documents and say the same thing about them.
§Example
use fraiseql_core::schema::{
ArgumentDefinition, FieldType, SubscriptionDefinition, SubscriptionFilter,
};
let mut paths = std::collections::HashMap::new();
paths.insert("order_id".to_string(), "/id".to_string());
let sub = SubscriptionDefinition::new("orderUpdated", "Order")
.with_argument(ArgumentDefinition::optional("orderId", FieldType::Id))
.with_filter(SubscriptionFilter { argument_paths: paths, static_filters: vec![] });
// `order_id` is the authoring spelling; the declared argument is `orderId`.
assert!(sub.filter_violation().unwrap().contains("order_id"));Sourcepub fn with_field(self, field: impl Into<String>) -> Self
pub fn with_field(self, field: impl Into<String>) -> Self
Add a field to project from event data.
Sourcepub fn deprecated(self, reason: Option<String>) -> Self
pub fn deprecated(self, reason: Option<String>) -> Self
Mark this subscription as deprecated.
§Example
use fraiseql_core::schema::SubscriptionDefinition;
let subscription = SubscriptionDefinition::new("oldUserEvents", "User")
.deprecated(Some("Use 'userEvents' instead".to_string()));
assert!(subscription.is_deprecated());Sourcepub const fn is_deprecated(&self) -> bool
pub const fn is_deprecated(&self) -> bool
Check if this subscription is deprecated.
Sourcepub fn deprecation_reason(&self) -> Option<&str>
pub fn deprecation_reason(&self) -> Option<&str>
Get the deprecation reason if deprecated.