puerto 0.10.1

Puerto — Rust full-stack DDD framework CLI. Scaffolds Clean Architecture projects with auto-wired DI, SQLx support, and zero manual wiring. Formerly puerto-framework.
use std::sync::Arc;

use business::{
    application::greeting::get_greeting::GetGreetingUseCaseImpl,
    domain::greeting::use_cases::get_greeting::{GetGreetingParams, GetGreetingUseCaseTrait},
};
use poem_openapi::{OpenApi, param::Path};

use crate::api::{error::IntoErrorResponse, greeting::{dto::GreetingDto, responses::GetGreetingResponse}, tags::ApiTags};

pub struct GreetingApi {
    pub get_greeting: Arc<GetGreetingUseCaseImpl>,
}

#[OpenApi]
impl GreetingApi {
    /// Get a greeting for the given name
    #[oai(path = "/greetings/:name", method = "get", tag = "ApiTags::Greeting")]
    async fn get_greeting(&self, name: Path<String>) -> GetGreetingResponse {
        match self.get_greeting.execute(GetGreetingParams { name: name.0 }).await {
            Ok(greeting) => GetGreetingResponse::Ok(poem_openapi::payload::Json(
                GreetingDto::from_greeting(&greeting),
            )),
            Err(err) => {
                let (status, error) = err.into_error_response();
                tracing::warn!(code = %error.0.name, "get_greeting failed");
                GetGreetingResponse::from_status(status, error)
            }
        }
    }
}