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//! ```ignore
44//! use fraiseql_core::graphql::{parse_query, FragmentResolver, DirectiveEvaluator};
45//!
46//! let query = r#"
47//! fragment UserFields on User { id name }
48//! query { users { ...UserFields } }
49//! "#;
50//!
51//! let parsed = parse_query(query)?;
52//! let resolver = FragmentResolver::new(&parsed.fragments);
53//! let resolved = resolver.resolve_spreads(&parsed.selections)?;
54//! ```
55
56// ============================================================================
57// Module declarations
58// ============================================================================
59
60/// GraphQL AST types for query representation.
61pub mod types;
62
63/// GraphQL query parsing wrapper.
64pub mod parser;
65
66/// Fragment resolution and expansion.
67pub mod fragment_resolver;
68
69/// Directive evaluation (@skip, @include).
70pub mod directive_evaluator;
71
72/// Fragment cycle detection.
73pub mod fragments;
74
75/// Query complexity analysis and DoS prevention.
76pub mod complexity;
77
78/// Field-level RBAC directive (@require_permission).
79pub mod require_permission_directive;
80
81// ============================================================================
82// Re-exports for convenient access
83// ============================================================================
84
85pub use complexity::{ComplexityAnalyzer, ComplexityConfig};
86pub use directive_evaluator::{
87 CustomDirectiveEvaluator, DirectiveError, DirectiveEvaluator, DirectiveHandler,
88 DirectiveResult, EvaluationContext, OperationType,
89};
90pub use fragment_resolver::{FragmentError, FragmentResolver};
91pub use fragments::FragmentGraph;
92pub use parser::parse_query;
93pub use require_permission_directive::RequirePermissionDirective;
94pub use types::{
95 Directive, FieldSelection, FragmentDefinition, GraphQLArgument, GraphQLType, ParsedQuery,
96 VariableDefinition,
97};
98
99// ============================================================================
100// Test modules
101// ============================================================================