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;