1use std::future::Future;
9use std::net::SocketAddr;
10use std::pin::Pin;
11
12mod adapters;
13mod app;
14#[cfg(feature = "auth")]
15mod auth;
16#[cfg(feature = "cache")]
17mod cache;
18#[cfg(feature = "compression")]
19mod compression;
20#[cfg(feature = "config")]
21mod config;
22#[cfg(feature = "cqrs")]
23mod cqrs;
24#[cfg(feature = "database")]
25mod database;
26mod discovery;
27mod error;
28#[cfg(feature = "events")]
29mod events;
30#[cfg(feature = "file-upload")]
31mod file_upload;
32#[cfg(feature = "health")]
33mod health;
34mod http;
35#[cfg(feature = "http-client")]
36mod http_client;
37#[cfg(feature = "ilink")]
38pub mod ilink;
39#[cfg(feature = "logging")]
40mod logging;
41mod module;
42mod openapi;
43mod openapi_security;
44mod percent;
45mod pipeline;
46mod provider;
47#[cfg(feature = "queue")]
48mod queue;
49#[cfg(feature = "request-context")]
50mod request_context;
51mod routing;
52#[cfg(feature = "schedule")]
53mod schedule;
54#[cfg(feature = "security")]
55mod security;
56mod serialization;
57#[cfg(feature = "session")]
58mod session;
59#[cfg(feature = "static")]
60mod static_files;
61mod testing;
62mod transport;
63mod validation;
64mod versioning;
65mod view;
66mod websocket;
67
68#[cfg(all(feature = "macros", feature = "session"))]
69pub use a3s_boot_macros::session;
70#[cfg(feature = "macros")]
71pub use a3s_boot_macros::{
72 all, api_cookie_auth, api_extension, api_extra_model, api_header, api_key_auth, api_param,
73 api_query, api_response_header, api_security, apply_decorators, bearer_auth, body, catch,
74 controller, cookie, cookies, delete, delete_json, event_pattern, extract, get, get_json, head,
75 header, headers, hide_from_openapi, host, host_param, http_code, injectable, ip, message_body,
76 message_controller, message_pattern, metadata, module, oauth2_auth, on_gateway_connection,
77 on_gateway_disconnect, on_gateway_init, open_id_connect_auth, operation, options, param,
78 params, patch, patch_json, payload, post, post_json, put, put_json, query, redirect, render,
79 request, request_body, res, response, serialize, skip_validation, sse, subscribe_message, tag,
80 use_filter, use_guard, use_interceptor, use_pipe, validate, version, version_neutral, versions,
81 websocket_gateway, ValidationSchema,
82};
83#[cfg(all(feature = "macros", feature = "cache"))]
84pub use a3s_boot_macros::{cache_key, cache_ttl};
85#[cfg(all(feature = "macros", feature = "schedule"))]
86pub use a3s_boot_macros::{cron, interval, schedule, timeout};
87#[cfg(all(feature = "macros", feature = "events"))]
88pub use a3s_boot_macros::{event_listener, on_event};
89#[cfg(all(feature = "macros", feature = "file-upload"))]
90pub use a3s_boot_macros::{uploaded_file, uploaded_files};
91#[cfg(feature = "axum")]
92pub use adapters::AxumAdapter;
93#[cfg(feature = "shutdown-hooks")]
94pub use app::{wait_for_shutdown_signal, ShutdownSignal};
95pub use app::{
96 BootApplication, BootApplicationBuilder, BootApplicationContext, BootApplicationHandle,
97 BootFactory, BootMicroservice, LazyLoadedModule, LazyModuleLoader, RouteMatch,
98};
99#[cfg(feature = "auth")]
100pub use auth::{
101 AuthCredentials, AuthGuard, AuthModule, AuthPrincipal, AuthService, AuthStrategy,
102 AuthStrategyDefinition, BearerAuthStrategy, BearerTokenVerifier, AUTH_PUBLIC_METADATA,
103 AUTH_ROLES_METADATA, AUTH_SCOPES_METADATA, AUTH_STRATEGY_METADATA,
104};
105#[cfg(feature = "cache")]
106pub use cache::{
107 Cache, CacheInterceptor, CacheModule, CacheOptions, CacheStore, InMemoryCacheStore,
108 CACHE_DISABLED_METADATA, CACHE_KEY_METADATA, CACHE_TTL_METADATA,
109};
110#[cfg(feature = "compression")]
111pub use compression::{CompressionInterceptor, CompressionOptions};
112#[cfg(feature = "config")]
113pub use config::{
114 acl_document_to_json, parse_acl_config, parse_validated_acl_config, ConfigModule,
115};
116#[cfg(feature = "cqrs")]
117pub use cqrs::{
118 Command, CommandBus, CommandHandler, CommandHandlerDefinition, CqrsContext, CqrsEvent,
119 CqrsModule, EventBus, EventHandler, EventHandlerDefinition, Query, QueryBus, QueryHandler,
120 QueryHandlerDefinition,
121};
122#[cfg(feature = "database")]
123pub use database::{
124 Database, DatabaseBackend, DatabaseModule, DatabaseResult, DatabaseRow, DatabaseStatement,
125 DatabaseTransaction, DatabaseTransactionBackend, InMemoryDatabaseBackend,
126 InMemoryDatabaseTransactionLog,
127};
128pub use discovery::{
129 ApplicationGraph, ApplicationGraphModule, DiscoveredGateway, DiscoveredMessagePattern,
130 DiscoveredModule, DiscoveredRoute, DiscoveryService, Reflector,
131};
132pub use error::{BootError, BootErrorKind};
133#[cfg(feature = "events")]
134pub use events::{
135 A3sEvent, A3sEventBus, A3sEventProvider, A3sMemoryEventConfig, A3sMemoryEventProvider,
136 EventContext, EventEmitter, EventEnvelope, EventListener, EventListenerDefinition, EventModule,
137};
138#[cfg(feature = "file-upload")]
139pub use file_upload::{MultipartField, MultipartForm, MultipartOptions, UploadedFile};
140#[cfg(feature = "health")]
141pub use health::{
142 HealthCheckService, HealthIndicator, HealthIndicatorResult, HealthModule, HealthReport,
143 HealthStatus,
144};
145pub use http::{
146 extract_request_value, transform_request_value, BootRequest, BootResponse, CookieOptions,
147 CookieSameSite, DefaultValuePipe, HttpMethod, ParseArrayPipe, ParseArraySeparatorPipe,
148 ParseBoolPipe, ParseEnumPipe, ParseFloatPipe, ParseFloatTarget, ParseIntPipe, ParseIntTarget,
149 ParseUuidPipe, ParseUuidVersionPipe, RequestExtractor, RequestValuePipe, ResponsePassthrough,
150 SseEvent, SseStream, StreamableFile, StreamableFileOptions, StreamableFileStream, UuidVersion,
151};
152#[cfg(feature = "http-client")]
153pub use http_client::{
154 HttpClientBackend, HttpClientOptions, HttpClientRequest, HttpClientResponse, HttpModule,
155 HttpService, ReqwestHttpClientBackend,
156};
157#[cfg(feature = "logging")]
158pub use logging::{
159 InMemoryLogSink, LogFields, LogLevel, LogRecord, LogSink, Logger, LoggingModule, NoopLogSink,
160 RequestLoggingInterceptor, RequestLoggingMiddleware,
161};
162pub use module::{DynamicModule, Module};
163pub use openapi::{
164 openapi_schema_name, OpenApiComponents, OpenApiDocument, OpenApiExample, OpenApiExternalDocs,
165 OpenApiHeader, OpenApiInfo, OpenApiMediaType, OpenApiOperation, OpenApiParameter,
166 OpenApiParameterLocation, OpenApiPathItem, OpenApiRef, OpenApiReferenceOr, OpenApiRequestBody,
167 OpenApiResponse, OpenApiRouteMetadata, OpenApiSchema, OpenApiServer, OpenApiTag,
168};
169pub use openapi_security::{
170 OpenApiApiKeyLocation, OpenApiOAuthFlow, OpenApiOAuthFlows, OpenApiSecurityRequirement,
171 OpenApiSecurityScheme,
172};
173pub use pipeline::{
174 catch_errors, CallHandler, CatchFilter, ExceptionFilter, ExecutionContext,
175 ExecutionInterceptor, ExecutionProtocol, ExecutionTransportKind, Guard, Interceptor,
176 Middleware, MiddlewareConsumer, MiddlewareConsumerBuilder, MiddlewareOutcome, MiddlewareRoute,
177 Pipe, TransportExceptionFilter, TransportExceptionResponse, TransportExecutionContext,
178 WebSocketExceptionFilter, WebSocketExceptionResponse, WebSocketExecutionContext,
179};
180pub use provider::{
181 ContextId, ContextIdFactory, FromModuleRef, ModuleRef, ProviderBeforeApplicationShutdown,
182 ProviderDefinition, ProviderDependency, ProviderOnApplicationBootstrap,
183 ProviderOnApplicationShutdown, ProviderOnModuleDestroy, ProviderOnModuleInit, ProviderRef,
184 ProviderScope, ProviderToken,
185};
186#[cfg(feature = "queue")]
187pub use queue::{
188 InProcessQueueBackend, Queue, QueueBackend, QueueContext, QueueJob, QueueJobFailure,
189 QueueJobInfo, QueueJobOptions, QueueJobPriority, QueueJobReceipt, QueueJobState, QueueModule,
190 QueueOptions, QueueProcessor, QueueRetryPolicy, QueueStats,
191};
192#[cfg(feature = "request-context")]
193pub use request_context::RequestContext;
194pub use routing::{ControllerDefinition, RouteDefinition, RouteHandler};
195#[cfg(feature = "schedule")]
196pub use schedule::{
197 InProcessScheduler, ScheduleContext, ScheduleModule, ScheduleTrigger, ScheduledJob,
198 ScheduledJobError, ScheduledJobInfo, ScheduledTask, Scheduler, SchedulerBackend,
199};
200#[cfg(feature = "security")]
201pub use security::{
202 CorsMiddleware, CorsOptions, CorsPreflightRoute, CorsResponseInterceptor, CsrfGuard,
203 CsrfOptions, InMemoryRateLimitProvider, RateLimitDecision, RateLimitGuard, RateLimitOptions,
204 RateLimitProvider, RateLimitRequest, SecurityHeadersInterceptor, SecurityHeadersOptions,
205};
206pub use serialization::{SerializationInterceptor, SerializationOptions};
207#[cfg(feature = "session")]
208pub use session::{
209 InMemorySessionStore, Session, SessionCookieInterceptor, SessionCookieSameSite, SessionManager,
210 SessionMiddleware, SessionModule, SessionOptions, SessionStore,
211};
212#[cfg(feature = "static")]
213pub use static_files::{StaticFileOptions, StaticFileService, StaticModule};
214pub use testing::{TestingModule, TestingModuleBuilder};
215#[cfg(feature = "grpc-transport")]
216pub use transport::{GrpcTransport, GrpcTransportClient, GrpcTransportOptions};
217pub use transport::{
218 InProcessTransport, InProcessTransportClient, IntoTransportReply, MessagePatternDefinition,
219 MessagePatternKind, MessageTransport, TransportContext, TransportGuard, TransportInterceptor,
220 TransportMessage, TransportPipe, TransportReply,
221};
222#[cfg(feature = "kafka-transport")]
223pub use transport::{KafkaTransport, KafkaTransportClient, KafkaTransportOptions};
224#[cfg(feature = "mqtt-transport")]
225pub use transport::{MqttTransport, MqttTransportClient, MqttTransportOptions, MqttTransportQoS};
226#[cfg(feature = "nats-transport")]
227pub use transport::{NatsTransport, NatsTransportClient, NatsTransportOptions};
228#[cfg(feature = "rabbitmq-transport")]
229pub use transport::{RabbitMqTransport, RabbitMqTransportClient, RabbitMqTransportOptions};
230#[cfg(feature = "redis-transport")]
231pub use transport::{RedisTransport, RedisTransportClient, RedisTransportOptions};
232#[cfg(feature = "tcp-transport")]
233pub use transport::{TcpTransport, TcpTransportClient, TcpTransportOptions};
234pub(crate) use validation::{
235 body_validator, body_validator_with_options, params_validator, params_validator_with_options,
236 query_validator, query_validator_with_options, validate_json_value_with_options,
237 validate_value, RequestValidator,
238};
239pub use validation::{Validate, ValidationOptions, ValidationSchema};
240pub use versioning::{ApiVersioning, ApiVersioningStrategy, RouteVersioning};
241pub use view::{StringTemplateViewEngine, ViewEngine, ViewModule, ViewRenderer};
242pub use websocket::{
243 IntoWebSocketReply, WebSocketConnection, WebSocketContext, WebSocketGatewayConnection,
244 WebSocketGatewayConnectionHook, WebSocketGatewayDefinition, WebSocketGatewayDisconnectHook,
245 WebSocketGatewayInitContext, WebSocketGatewayInitHook, WebSocketGatewayServer, WebSocketGuard,
246 WebSocketInterceptor, WebSocketMessage, WebSocketOutbound, WebSocketPipe,
247 WebSocketSubscriptionDefinition,
248};
249
250pub type Result<T> = std::result::Result<T, BootError>;
252
253pub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
255
256pub trait HttpAdapter {
258 type Output;
259
260 fn build(&self, app: BootApplication) -> Result<Self::Output>;
261
262 fn serve(&self, app: BootApplication, addr: SocketAddr) -> BoxFuture<'static, Result<()>>;
263}