Skip to main content

fraiseql_core/graphql/
mod.rs

1//! GraphQL parsing and query processing.
2//!
3//! This module provides runtime GraphQL query handling:
4//! - Query parsing via `graphql-parser` crate
5//! - Fragment resolution and expansion
6//! - Directive evaluation (@skip, @include)
7//! - Fragment cycle detection
8//!
9//! # Architecture
10//!
11//! ```text
12//! Incoming GraphQL Query
13//!         │
14//!         ▼
15//!   ┌─────────────┐
16//!   │   Parser    │  ← graphql-parser crate
17//!   └──────┬──────┘
18//!          │ ParsedQuery
19//!          ▼
20//!   ┌─────────────┐
21//!   │  Fragment   │  ← Cycle detection
22//!   │  Validator  │
23//!   └──────┬──────┘
24//!          │
25//!          ▼
26//!   ┌─────────────┐
27//!   │  Fragment   │  ← Spread expansion
28//!   │  Resolver   │
29//!   └──────┬──────┘
30//!          │ Resolved selections
31//!          ▼
32//!   ┌─────────────┐
33//!   │  Directive  │  ← @skip/@include
34//!   │  Evaluator  │
35//!   └──────┬──────┘
36//!          │ Final field list
37//!          ▼
38//!     SQL Generation
39//! ```
40//!
41//! # Example
42//!
43//! ```no_run
44//! // Requires: fraiseql_core graphql module (internal types).
45//! use fraiseql_core::graphql::{parse_query, FragmentResolver, DirectiveEvaluator};
46//! # fn example() -> Result<(), Box<dyn std::error::Error>> {
47//! let query = r#"
48//!     fragment UserFields on User { id name }
49//!     query { users { ...UserFields } }
50//! "#;
51//!
52//! let parsed = parse_query(query)?;
53//! let resolver = FragmentResolver::new(&parsed.fragments);
54//! let resolved = resolver.resolve_spreads(&parsed.selections)?;
55//! # Ok(())
56//! # }
57//! ```
58
59// ============================================================================
60// Module declarations
61// ============================================================================
62
63/// GraphQL AST types for query representation.
64pub mod types;
65
66/// GraphQL query parsing wrapper.
67pub mod parser;
68
69/// Fragment resolution and expansion.
70pub mod fragment_resolver;
71
72/// Directive evaluation (@skip, @include).
73pub mod directive_evaluator;
74
75/// Fragment cycle detection.
76pub mod fragments;
77
78/// Query complexity analysis and `DoS` prevention.
79pub mod complexity;
80
81/// Field-level RBAC directive (@require_permission).
82pub mod require_permission_directive;
83
84// ============================================================================
85// Re-exports for convenient access
86// ============================================================================
87
88pub use complexity::{
89    ComplexityConfig, ComplexityValidationError, DEFAULT_MAX_ALIASES, MAX_VARIABLES_COUNT,
90    QueryMetrics, RequestValidator, parse_graphql_document,
91};
92pub use directive_evaluator::{
93    CustomDirectiveEvaluator, DirectiveError, DirectiveEvaluator, DirectiveHandler,
94    DirectiveResult, EvaluationContext, OperationType,
95};
96pub use fragment_resolver::{FragmentError, FragmentResolver};
97pub use fragments::FragmentGraph;
98pub use parser::parse_query;
99pub use require_permission_directive::RequirePermissionDirective;
100pub use types::{
101    Directive, FieldSelection, FragmentDefinition, GraphQLArgument, GraphQLType, ParsedQuery,
102    VariableDefinition,
103};
104
105// ============================================================================
106// Test modules
107// ============================================================================
108
109#[cfg(test)]
110mod tests;