1#![forbid(unsafe_code)]
25#![allow(missing_docs)]
27#![warn(clippy::all)]
28#![warn(clippy::pedantic)]
29#![allow(clippy::struct_excessive_bools)] #![allow(clippy::cast_possible_truncation)] #![allow(clippy::cast_precision_loss)] #![allow(clippy::doc_markdown)] #![allow(clippy::module_name_repetitions)] #![allow(clippy::must_use_candidate)] #![allow(clippy::missing_errors_doc)] #![allow(clippy::missing_panics_doc)] #![allow(clippy::needless_pass_by_value)] #![allow(clippy::unused_async)] #![allow(clippy::similar_names)] #![allow(clippy::unused_self)] #![allow(clippy::match_same_arms)] #![allow(clippy::double_must_use)] #![allow(clippy::unnecessary_wraps)] #![allow(clippy::return_self_not_must_use)] #![allow(clippy::too_many_lines)] #![allow(clippy::cast_sign_loss)] #![allow(clippy::missing_fields_in_debug)] #![allow(clippy::default_trait_access)] #![allow(clippy::wildcard_imports)] #![allow(clippy::items_after_statements)] #![allow(clippy::no_effect_underscore_binding)] #![allow(clippy::cast_possible_wrap)] #![allow(clippy::struct_field_names)] #![allow(clippy::single_char_pattern)] #![allow(clippy::elidable_lifetime_names)] #![allow(clippy::manual_let_else)] #![allow(clippy::redundant_closure)] #![allow(clippy::unchecked_time_subtraction)] #![allow(clippy::uninlined_format_args)] #![allow(clippy::unnested_or_patterns)] #![allow(clippy::used_underscore_binding)] #![allow(clippy::cast_lossless)] #![allow(clippy::format_push_string)] #![allow(clippy::if_same_then_else)] #![allow(clippy::ignored_unit_patterns)] #![allow(clippy::map_unwrap_or)] #![allow(clippy::redundant_closure_for_method_calls)] #![allow(clippy::single_match_else)] #![allow(clippy::unnecessary_debug_formatting)] #![allow(clippy::useless_format)] #![allow(clippy::float_cmp)] pub mod api;
76pub mod error;
77pub mod extractors;
78pub mod federation;
79pub mod logging;
80pub mod middleware;
81pub mod performance;
82pub mod routes;
83pub mod schema;
84pub mod server;
85pub mod server_config;
86pub mod subscriptions;
87pub mod validation;
88
89pub mod metrics_server;
91pub mod tracing_server;
92
93pub mod config;
95pub mod lifecycle;
96pub mod observability;
97pub mod operational;
98pub mod resilience;
99pub mod runtime_state;
100pub mod tracing_utils;
101
102pub mod webhooks;
104
105pub mod files;
107
108pub mod auth;
110
111pub mod secrets;
113
114pub mod secrets_manager;
116
117pub mod encryption;
119
120pub mod backup;
122
123pub mod tls;
125pub mod tls_listener;
126
127#[cfg(feature = "observers")]
129pub mod observers;
130
131#[cfg(feature = "arrow")]
133pub mod arrow;
134
135#[cfg(any(test, feature = "testing"))]
137pub mod testing;
138
139pub use logging::{
140 ErrorDetails, LogLevel, LogMetrics, RequestContext, RequestId, RequestLogger, SourceLocation,
141 StructuredLogEntry,
142};
143pub use metrics_server::{MetricsCollector, PrometheusMetrics};
144pub use performance::{
145 OperationProfile, PerformanceMonitor, PerformanceStats, PerformanceTimer, QueryPerformance,
146};
147pub use schema::CompiledSchemaLoader;
148pub use secrets::SecretManager;
149pub use server::Server;
150pub use server_config::ServerConfig;
151pub use tls::TlsSetup;
152pub use tracing_server::{SpanStatus, TraceContext, TraceEvent, TraceParseError, TraceSpan};
153pub use validation::{RequestValidator, ValidationError};
154
155#[derive(Debug, thiserror::Error)]
157pub enum ServerError {
158 #[error("Failed to bind server: {0}")]
160 BindError(String),
161
162 #[error("Configuration error: {0}")]
164 ConfigError(String),
165
166 #[error("Runtime error: {0}")]
168 RuntimeError(#[from] fraiseql_core::error::FraiseQLError),
169
170 #[error("IO error: {0}")]
172 IoError(#[from] std::io::Error),
173
174 #[error("Database error: {0}")]
176 Database(String),
177
178 #[error("Validation error: {0}")]
180 Validation(String),
181
182 #[error("Conflict: {0}")]
184 Conflict(String),
185
186 #[error("Not found: {0}")]
188 NotFound(String),
189}
190
191pub type Result<T> = std::result::Result<T, ServerError>;