| Crates.io | toni |
| lib.rs | toni |
| version | 0.1.1 |
| created_at | 2025-02-14 19:45:50.044518+00 |
| updated_at | 2025-02-15 01:09:51.872568+00 |
| description | Fast and modular web framework for scalable applications |
| homepage | https://github.com/monterxto/toni-rs |
| repository | https://github.com/monterxto/toni-rs |
| max_upload_size | |
| id | 1555933 |
| size | 93,391 |
Toni is a Rust backend framework designed for building modular and scalable applications inspired by the Nest.js architecture. It provides a structured approach to organizing your code with controllers, services, and modules, while remaining decoupled from the HTTP server (Axum adapted and used by default).
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()
}
}