A Rust framework for building efficient and scalable server-side applications.
Toni is a framework for building efficient and scalable server-side Rust applications. It was inspired by NestJS architecture, offering a clean architecture and a developer-friendly experience.
Under the hood, Toni uses Axum, but it is built to be easily integrated with other HTTP servers.
- Modular Architecture: Organize your application into reusable modules.
- HTTP Server Flexibility: Use Axum or integrate your preferred server.
- Dependency Injection: Manage dependencies cleanly with module providers.
- Macro-Driven Syntax: Reduce boilerplate with intuitive procedural macros.
- Rust & Cargo: Ensure Rust is installed.
- Toni CLI: Install the CLI tool globally:
cargo install toni-cli
Use the Toni CLI to create a new project:
toni new my_app
src/
├── app/
│ ├── app.controller.rs
│ ├── app.module.rs
│ ├── app.service.rs
│ └── mod.rs
└── main.rs
cargo run
Test your endpoints at http://localhost:3000/app
.
File | Role |
---|---|
app.controller.rs |
Defines routes and handles HTTP requests. |
app.module.rs |
Configures dependencies and module setup. |
app.service.rs |
Implements core business logic. |
Toni decouples your application from the HTTP server, and by default we use Axum. In the future we plan to integrate other HTTP adapters.
main.rs
use toni::{ToniFactory, AxumAdapter};
#[tokio::main]
async fn main() {
let axum_adapter = AxumAdapter::new();
let factory = ToniFactory::new();
let app = factory.create(AppModule::module_definition(), axum_adapter);
app.listen(3000, "127.0.0.1").await;
}
app/app.module.rs
(Root Module)
#[module(
imports: [],
controllers: [_AppController],
providers: [_AppService],
exports: []
)]
pub struct AppModule;
app/app.controller.rs
(HTTP Routes)
#[controller_struct(
pub struct _AppController {
app_service: _AppService
}
)]
#[controller("/app")]
impl _AppController {
#[post("")]
fn create(&self, _req: HttpRequest) -> Body {
Body::Text(self.app_service.create())
}
#[get("")]
fn find_all(&self, _req: HttpRequest) -> Body {
Body::Text(self.app_service.find_all())
}
}
app/app.service.rs
(Business Logic)
#[provider_struct(
pub struct _AppService;
)]
impl _AppService {
pub fn create(&self) -> String {
"Item created!".into()
}
pub fn find_all(&self) -> String {
"All items!".into()
}
}
Toni is MIT licensed.