use std::future::Future;
use std::net::SocketAddr;
use std::pin::Pin;
mod adapters;
mod app;
#[cfg(feature = "auth")]
mod auth;
#[cfg(feature = "cache")]
mod cache;
#[cfg(feature = "compression")]
mod compression;
#[cfg(feature = "config")]
mod config;
#[cfg(feature = "cqrs")]
mod cqrs;
#[cfg(feature = "database")]
mod database;
mod discovery;
mod error;
#[cfg(feature = "events")]
mod events;
#[cfg(feature = "file-upload")]
mod file_upload;
#[cfg(feature = "health")]
mod health;
mod http;
#[cfg(feature = "http-client")]
mod http_client;
#[cfg(feature = "ilink")]
pub mod ilink;
#[cfg(feature = "logging")]
mod logging;
mod module;
mod openapi;
mod openapi_security;
mod percent;
mod pipeline;
mod provider;
#[cfg(feature = "queue")]
mod queue;
#[cfg(feature = "request-context")]
mod request_context;
mod routing;
#[cfg(feature = "schedule")]
mod schedule;
#[cfg(feature = "security")]
mod security;
mod serialization;
#[cfg(feature = "session")]
mod session;
#[cfg(feature = "static")]
mod static_files;
mod testing;
mod transport;
mod validation;
mod versioning;
mod view;
mod websocket;
#[cfg(all(feature = "macros", feature = "session"))]
pub use a3s_boot_macros::session;
#[cfg(feature = "macros")]
pub use a3s_boot_macros::{
all, api_cookie_auth, api_extension, api_extra_model, api_header, api_key_auth, api_param,
api_query, api_response_header, api_security, apply_decorators, bearer_auth, body, catch,
controller, cookie, cookies, delete, delete_json, event_pattern, extract, get, get_json, head,
header, headers, hide_from_openapi, host, host_param, http_code, injectable, ip, message_body,
message_controller, message_pattern, metadata, module, oauth2_auth, on_gateway_connection,
on_gateway_disconnect, on_gateway_init, open_id_connect_auth, operation, options, param,
params, patch, patch_json, payload, post, post_json, put, put_json, query, redirect, render,
request, request_body, res, response, serialize, skip_validation, sse, subscribe_message, tag,
use_filter, use_guard, use_interceptor, use_pipe, validate, version, version_neutral, versions,
websocket_gateway, ValidationSchema,
};
#[cfg(all(feature = "macros", feature = "cache"))]
pub use a3s_boot_macros::{cache_key, cache_ttl};
#[cfg(all(feature = "macros", feature = "schedule"))]
pub use a3s_boot_macros::{cron, interval, schedule, timeout};
#[cfg(all(feature = "macros", feature = "events"))]
pub use a3s_boot_macros::{event_listener, on_event};
#[cfg(all(feature = "macros", feature = "file-upload"))]
pub use a3s_boot_macros::{uploaded_file, uploaded_files};
#[cfg(feature = "axum")]
pub use adapters::AxumAdapter;
#[cfg(feature = "shutdown-hooks")]
pub use app::{wait_for_shutdown_signal, ShutdownSignal};
pub use app::{
BootApplication, BootApplicationBuilder, BootApplicationContext, BootApplicationHandle,
BootFactory, BootMicroservice, LazyLoadedModule, LazyModuleLoader, RouteMatch,
};
#[cfg(feature = "auth")]
pub use auth::{
AuthCredentials, AuthGuard, AuthModule, AuthPrincipal, AuthService, AuthStrategy,
AuthStrategyDefinition, BearerAuthStrategy, BearerTokenVerifier, AUTH_PUBLIC_METADATA,
AUTH_ROLES_METADATA, AUTH_SCOPES_METADATA, AUTH_STRATEGY_METADATA,
};
#[cfg(feature = "cache")]
pub use cache::{
Cache, CacheInterceptor, CacheModule, CacheOptions, CacheStore, InMemoryCacheStore,
CACHE_DISABLED_METADATA, CACHE_KEY_METADATA, CACHE_TTL_METADATA,
};
#[cfg(feature = "compression")]
pub use compression::{CompressionInterceptor, CompressionOptions};
#[cfg(feature = "config")]
pub use config::{
acl_document_to_json, parse_acl_config, parse_validated_acl_config, ConfigModule,
};
#[cfg(feature = "cqrs")]
pub use cqrs::{
Command, CommandBus, CommandHandler, CommandHandlerDefinition, CqrsContext, CqrsEvent,
CqrsModule, EventBus, EventHandler, EventHandlerDefinition, Query, QueryBus, QueryHandler,
QueryHandlerDefinition,
};
#[cfg(feature = "database")]
pub use database::{
Database, DatabaseBackend, DatabaseModule, DatabaseResult, DatabaseRow, DatabaseStatement,
DatabaseTransaction, DatabaseTransactionBackend, InMemoryDatabaseBackend,
InMemoryDatabaseTransactionLog,
};
pub use discovery::{
ApplicationGraph, ApplicationGraphModule, DiscoveredGateway, DiscoveredMessagePattern,
DiscoveredModule, DiscoveredRoute, DiscoveryService, Reflector,
};
pub use error::{BootError, BootErrorKind};
#[cfg(feature = "events")]
pub use events::{
A3sEvent, A3sEventBus, A3sEventProvider, A3sMemoryEventConfig, A3sMemoryEventProvider,
EventContext, EventEmitter, EventEnvelope, EventListener, EventListenerDefinition, EventModule,
};
#[cfg(feature = "file-upload")]
pub use file_upload::{MultipartField, MultipartForm, MultipartOptions, UploadedFile};
#[cfg(feature = "health")]
pub use health::{
HealthCheckService, HealthIndicator, HealthIndicatorResult, HealthModule, HealthReport,
HealthStatus,
};
pub use http::{
extract_request_value, transform_request_value, BootRequest, BootResponse, CookieOptions,
CookieSameSite, DefaultValuePipe, HttpMethod, ParseArrayPipe, ParseArraySeparatorPipe,
ParseBoolPipe, ParseEnumPipe, ParseFloatPipe, ParseFloatTarget, ParseIntPipe, ParseIntTarget,
ParseUuidPipe, ParseUuidVersionPipe, RequestExtractor, RequestValuePipe, ResponsePassthrough,
SseEvent, SseStream, StreamableFile, StreamableFileOptions, StreamableFileStream, UuidVersion,
};
#[cfg(feature = "http-client")]
pub use http_client::{
HttpClientBackend, HttpClientOptions, HttpClientRequest, HttpClientResponse, HttpModule,
HttpService, ReqwestHttpClientBackend,
};
#[cfg(feature = "logging")]
pub use logging::{
InMemoryLogSink, LogFields, LogLevel, LogRecord, LogSink, Logger, LoggingModule, NoopLogSink,
RequestLoggingInterceptor, RequestLoggingMiddleware,
};
pub use module::{DynamicModule, Module};
pub use openapi::{
openapi_schema_name, OpenApiComponents, OpenApiDocument, OpenApiExample, OpenApiExternalDocs,
OpenApiHeader, OpenApiInfo, OpenApiMediaType, OpenApiOperation, OpenApiParameter,
OpenApiParameterLocation, OpenApiPathItem, OpenApiRef, OpenApiReferenceOr, OpenApiRequestBody,
OpenApiResponse, OpenApiRouteMetadata, OpenApiSchema, OpenApiServer, OpenApiTag,
};
pub use openapi_security::{
OpenApiApiKeyLocation, OpenApiOAuthFlow, OpenApiOAuthFlows, OpenApiSecurityRequirement,
OpenApiSecurityScheme,
};
pub use pipeline::{
catch_errors, CallHandler, CatchFilter, ExceptionFilter, ExecutionContext,
ExecutionInterceptor, ExecutionProtocol, ExecutionTransportKind, Guard, Interceptor,
Middleware, MiddlewareConsumer, MiddlewareConsumerBuilder, MiddlewareOutcome, MiddlewareRoute,
Pipe, TransportExceptionFilter, TransportExceptionResponse, TransportExecutionContext,
WebSocketExceptionFilter, WebSocketExceptionResponse, WebSocketExecutionContext,
};
pub use provider::{
ContextId, ContextIdFactory, FromModuleRef, ModuleRef, ProviderBeforeApplicationShutdown,
ProviderDefinition, ProviderDependency, ProviderOnApplicationBootstrap,
ProviderOnApplicationShutdown, ProviderOnModuleDestroy, ProviderOnModuleInit, ProviderRef,
ProviderScope, ProviderToken,
};
#[cfg(feature = "queue")]
pub use queue::{
InProcessQueueBackend, Queue, QueueBackend, QueueContext, QueueJob, QueueJobFailure,
QueueJobInfo, QueueJobOptions, QueueJobPriority, QueueJobReceipt, QueueJobState, QueueModule,
QueueOptions, QueueProcessor, QueueRetryPolicy, QueueStats,
};
#[cfg(feature = "request-context")]
pub use request_context::RequestContext;
pub use routing::{ControllerDefinition, RouteDefinition, RouteHandler};
#[cfg(feature = "schedule")]
pub use schedule::{
InProcessScheduler, ScheduleContext, ScheduleModule, ScheduleTrigger, ScheduledJob,
ScheduledJobError, ScheduledJobInfo, ScheduledTask, Scheduler, SchedulerBackend,
};
#[cfg(feature = "security")]
pub use security::{
CorsMiddleware, CorsOptions, CorsPreflightRoute, CorsResponseInterceptor, CsrfGuard,
CsrfOptions, InMemoryRateLimitProvider, RateLimitDecision, RateLimitGuard, RateLimitOptions,
RateLimitProvider, RateLimitRequest, SecurityHeadersInterceptor, SecurityHeadersOptions,
};
pub use serialization::{SerializationInterceptor, SerializationOptions};
#[cfg(feature = "session")]
pub use session::{
InMemorySessionStore, Session, SessionCookieInterceptor, SessionCookieSameSite, SessionManager,
SessionMiddleware, SessionModule, SessionOptions, SessionStore,
};
#[cfg(feature = "static")]
pub use static_files::{StaticFileOptions, StaticFileService, StaticModule};
pub use testing::{TestingModule, TestingModuleBuilder};
#[cfg(feature = "grpc-transport")]
pub use transport::{GrpcTransport, GrpcTransportClient, GrpcTransportOptions};
pub use transport::{
InProcessTransport, InProcessTransportClient, IntoTransportReply, MessagePatternDefinition,
MessagePatternKind, MessageTransport, TransportContext, TransportGuard, TransportInterceptor,
TransportMessage, TransportPipe, TransportReply,
};
#[cfg(feature = "kafka-transport")]
pub use transport::{KafkaTransport, KafkaTransportClient, KafkaTransportOptions};
#[cfg(feature = "mqtt-transport")]
pub use transport::{MqttTransport, MqttTransportClient, MqttTransportOptions, MqttTransportQoS};
#[cfg(feature = "nats-transport")]
pub use transport::{NatsTransport, NatsTransportClient, NatsTransportOptions};
#[cfg(feature = "rabbitmq-transport")]
pub use transport::{RabbitMqTransport, RabbitMqTransportClient, RabbitMqTransportOptions};
#[cfg(feature = "redis-transport")]
pub use transport::{RedisTransport, RedisTransportClient, RedisTransportOptions};
#[cfg(feature = "tcp-transport")]
pub use transport::{TcpTransport, TcpTransportClient, TcpTransportOptions};
pub(crate) use validation::{
body_validator, body_validator_with_options, params_validator, params_validator_with_options,
query_validator, query_validator_with_options, validate_json_value_with_options,
validate_value, RequestValidator,
};
pub use validation::{Validate, ValidationOptions, ValidationSchema};
pub use versioning::{ApiVersioning, ApiVersioningStrategy, RouteVersioning};
pub use view::{StringTemplateViewEngine, ViewEngine, ViewModule, ViewRenderer};
pub use websocket::{
IntoWebSocketReply, WebSocketConnection, WebSocketContext, WebSocketGatewayConnection,
WebSocketGatewayConnectionHook, WebSocketGatewayDefinition, WebSocketGatewayDisconnectHook,
WebSocketGatewayInitContext, WebSocketGatewayInitHook, WebSocketGatewayServer, WebSocketGuard,
WebSocketInterceptor, WebSocketMessage, WebSocketOutbound, WebSocketPipe,
WebSocketSubscriptionDefinition,
};
pub type Result<T> = std::result::Result<T, BootError>;
pub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
pub trait HttpAdapter {
type Output;
fn build(&self, app: BootApplication) -> Result<Self::Output>;
fn serve(&self, app: BootApplication, addr: SocketAddr) -> BoxFuture<'static, Result<()>>;
}