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::{{ snake }}::create_{{ snake }}::Create{{ pascal }}UseCaseImpl,
    domain::{{ snake }}::use_cases::create_{{ snake }}::{Create{{ pascal }}Params, Create{{ pascal }}UseCaseTrait},
};
use poem_openapi::{OpenApi, payload::Json};

use crate::api::error::IntoErrorResponse;
use crate::api::tags::ApiTags;
use crate::api::{{ snake }}::dto::{Create{{ pascal }}Request, {{ pascal }}Dto};
use crate::api::{{ snake }}::responses::Create{{ pascal }}Response;

pub struct {{ pascal }}Api {
    pub create_{{ snake }}: Arc<Create{{ pascal }}UseCaseImpl>,
}

#[OpenApi]
impl {{ pascal }}Api {
    /// Create a new {{ pascal }}
    #[oai(path = "/{{ snake }}s", method = "post", tag = "ApiTags::{{ pascal }}")]
    async fn create(&self, body: Json<Create{{ pascal }}Request>) -> Create{{ pascal }}Response {
        match self
            .create_{{ snake }}
            .execute(Create{{ pascal }}Params { name: body.name.clone() })
            .await
        {
            Ok(entity) => Create{{ pascal }}Response::Created(Json({{ pascal }}Dto::from_domain(&entity))),
            Err(err) => {
                let (status, error) = err.into_error_response();
                tracing::warn!(code = %error.0.name, "create_{{ snake }} failed");
                Create{{ pascal }}Response::from_status(status, error)
            }
        }
    }
}