puerto 0.10.0

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 business::domain::{{ snake }}::errors::{{ pascal }}Error;
use poem::http::StatusCode;
use poem_openapi::payload::Json;

use crate::api::error::{ErrorResponse, IntoErrorResponse};

impl IntoErrorResponse for {{ pascal }}Error {
    /// Exhaustive on purpose: a new error variant does not compile until it has a status.
    fn into_error_response(self) -> (StatusCode, Json<ErrorResponse>) {
        let status = match &self {
            {{ pascal }}Error::ValidationError(_) => StatusCode::UNPROCESSABLE_ENTITY,
            {{ pascal }}Error::NotFound => StatusCode::NOT_FOUND,
            {{ pascal }}Error::Duplicate => StatusCode::CONFLICT,
            {{ pascal }}Error::RepositoryError => StatusCode::INTERNAL_SERVER_ERROR,
            {{ pascal }}Error::Unknown => StatusCode::INTERNAL_SERVER_ERROR,{{ vo_arms_str }}
        };
        (status, Json(ErrorResponse::from_code(self.to_string())))
    }
}

#[cfg(test)]
mod tests {
    use super::*;
{% for case in test_cases %}
    #[test]
    fn {{ case.test_name }}() {
        // Act
        let (status, Json(body)) = {{ case.error }}.into_error_response();

        // Assert
        assert_eq!(status, StatusCode::{{ case.status }});
        assert_eq!(body.name, "{{ case.code }}");
    }
{% endfor %}}