Files
framework/README_ru.md
T
2026-05-31 02:29:19 +03:00

3.2 KiB

Desert Framework

English version

Микрофреймворк для построения backend приложений на Rust с Axum. Предоставляет систему внедрения зависимостей и макросы для декларативного определения маршрутов.

Установка

[dependencies]
desert-framework = "0.1.0"

Модули

Service — система внедрения зависимостей

use std::sync::Arc;
use desert_framework::{Service, DependencyManager, dep, inject_services};

struct DatabaseService {
    pool: PgPool,
}

impl Service for DatabaseService {
    fn name() -> String { "DatabaseService".into() }

    async fn new(_manager: Arc<DependencyManager>) -> Self {
        Self { pool: PgPool::connect("...").await.unwrap() }
    }
}

struct UserService {
    db: Arc<DatabaseService>,
}

impl Service for UserService {
    fn name() -> String { "UserService".into() }

    fn deps() -> Vec<Dependency> {
        vec![dep::<DatabaseService>()]
    }

    async fn new(manager: Arc<DependencyManager>) -> Self {
        Self { db: manager.get::<DatabaseService>("UserService").await.unwrap() }
    }
}

// Инициализация
let manager = DependencyManager::new();
let db = manager.register::<DatabaseService>().await;
let user_svc = manager.register::<UserService>().await;

// Инъекция через макрос
inject_services!(manager, "MyFunc", {
    db: DatabaseService,
    users: UserService,
});

Controller — макросы для Axum маршрутов

use desert_framework::{controller, get, post, impl_routes};

#[controller(path = "/api/users")]
struct UserController {
    user_service: Arc<UserService>,
}

impl UserController {
    #[get("/")]
    async fn list(&self) -> Json<Vec<User>> {
        Json(self.user_service.list().await)
    }

    #[get("/{id}")]
    async fn get(&self, Path(id): Path<u64>) -> Json<User> {
        Json(self.user_service.get(id).await)
    }

    #[post("/")]
    async fn create(&self, Json(body): Json<CreateUser>) -> Json<User> {
        Json(self.user_service.create(body).await)
    }
}

impl_routes!(UserController, [list, get, create]);

// Использование в приложении
let controller = UserController { user_service };
let router = controller.get_router();

let app = Router::new()
    .merge(user_controller.get_router())
    .merge(post_controller.get_router());

Макросы

Макрос Назначение
#[controller(path = "/prefix")] Определяет контроллер с базовым путём
#[get("/path")] GET маршрут
#[post("/path")] POST маршрут
#[put("/path")] PUT маршрут
#[delete("/path")] DELETE маршрут
#[patch("/path")] PATCH маршрут
impl_routes!(Type, [methods]) Генерирует get_router() для контроллера
inject_services! Быстрая инъекция сервисов

Параметры маршрутов

#[get("/items/{id}")]
async fn get_item(&self, Path(id): Path<String>) -> String {
    format!("item: {}", id)
}

Лицензия

MIT