ModuleRefModules and dependency injection
Visibility, imports, exports, scopes, async factories, and lifecycle live in a typed container.
Compose modules, providers, controllers, and protocol pipelines without hiding adapters or runtime boundaries.
#[controller("/users")]
impl UserController {
#[get("/{id}")]
async fn find(#[param("id")] id: Uuid) {}
}Defaults include Axum, attribute macros, and graceful shutdown. Every other module is feature-gated.
a3s-boot = "0.2.0"Boot borrows NestJS organization without hiding the dependency graph, protocol adapter, or error types.
ModuleRefVisibility, imports, exports, scopes, async factories, and lifecycle live in a typed container.
#[controller]Attributes generate registration for ordinary Rust types while explicit builders remain available.
ExecutionContextMiddleware, guards, interceptors, pipes, validation, and filters have a fixed order.
MessageTransportHTTP, WebSocket, and message transports share scope, validation, and enhancer semantics.
Every stage remains testable, inspectable, and replaceable.
Modules list providers, controllers, gateways, and imports
Validate tokens, visibility, scopes, and route conflicts
Construct singleton, request, or transient dependencies
Axum or a message transport takes the network boundary
Compose config, logging, cache, database, sessions, security, CQRS, events, scheduling, health, and files on demand.
HTTP, WebSocket, TCP, Redis, NATS, MQTT, RabbitMQ, Kafka, gRPC, queues, and iLink use explicit contracts.
Run the default Axum app, then enable modules and protocols at business boundaries.