Skip to main content

a3s_boot/
lib.rs

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