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//! ```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// ============================================================================