pub struct ApiResponse<T> {
pub success: bool,
pub data: Option<T>,
pub error: Option<ApiError>,
pub message: Option<String>,
}Expand description
Standard API response wrapper.
Encapsulates success/error status, optional data payload, optional error details, and an optional human-readable message.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::success("hello");
assert!(resp.success);
assert_eq!(resp.data, Some("hello"));Fields§
§success: bool§data: Option<T>§error: Option<ApiError>§message: Option<String>Implementations§
Source§impl<T> ApiResponse<T>
impl<T> ApiResponse<T>
Sourcepub fn success(data: T) -> Self
pub fn success(data: T) -> Self
Create a successful response carrying data.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::success(42u32);
assert!(resp.success);
assert_eq!(resp.data, Some(42));Sourcepub fn cast<U>(self) -> ApiResponse<U>
pub fn cast<U>(self) -> ApiResponse<U>
Convert this response to another data type, discarding the payload.
Useful for propagating error responses where the data type differs.
§Example
use auth_framework::api::responses::ApiResponse;
let err = ApiResponse::<()>::error("FAIL", "oops");
let typed: ApiResponse<String> = err.cast();
assert!(!typed.success);Sourcepub fn forbidden_typed() -> ApiResponse<T>
pub fn forbidden_typed() -> ApiResponse<T>
Create a forbidden (403) response for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<String> = ApiResponse::forbidden_typed();
assert!(!resp.success);Create an unauthorized (401) response for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<Vec<u8>> = ApiResponse::unauthorized_typed();
assert!(!resp.success);Sourcepub fn error_typed(code: &str, message: impl Into<String>) -> ApiResponse<T>
pub fn error_typed(code: &str, message: impl Into<String>) -> ApiResponse<T>
Create an error response for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<i32> = ApiResponse::error_typed("FAIL", "bad input");
assert!(!resp.success);Sourcepub fn validation_error_typed(message: impl Into<String>) -> ApiResponse<T>
pub fn validation_error_typed(message: impl Into<String>) -> ApiResponse<T>
Create a validation error (400) response for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<()> = ApiResponse::validation_error_typed("bad field");
assert!(!resp.success);Sourcepub fn not_found_typed(message: impl Into<String>) -> ApiResponse<T>
pub fn not_found_typed(message: impl Into<String>) -> ApiResponse<T>
Create a not-found (404) response for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<String> = ApiResponse::not_found_typed("user");
assert!(!resp.success);Sourcepub fn forbidden_with_message_typed(
message: impl Into<String>,
) -> ApiResponse<T>
pub fn forbidden_with_message_typed( message: impl Into<String>, ) -> ApiResponse<T>
Create a forbidden (403) response with a custom message for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<()> = ApiResponse::forbidden_with_message_typed("admin only");
assert!(!resp.success);Sourcepub fn error_with_message_typed(
code: &str,
message: impl Into<String>,
) -> ApiResponse<T>
pub fn error_with_message_typed( code: &str, message: impl Into<String>, ) -> ApiResponse<T>
Create an error response with a custom code and message for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<()> = ApiResponse::error_with_message_typed("QUOTA", "exceeded");
assert_eq!(resp.error.unwrap().code, "QUOTA");Sourcepub fn not_found_with_message_typed(
message: impl Into<String>,
) -> ApiResponse<T>
pub fn not_found_with_message_typed( message: impl Into<String>, ) -> ApiResponse<T>
Create a not-found (404) response with a custom message for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<()> = ApiResponse::not_found_with_message_typed("gone");
assert!(!resp.success);Sourcepub fn internal_error_typed() -> ApiResponse<T>
pub fn internal_error_typed() -> ApiResponse<T>
Create an internal server error (500) response for any data type T.
§Example
use auth_framework::api::responses::ApiResponse;
let resp: ApiResponse<()> = ApiResponse::internal_error_typed();
assert!(!resp.success);Sourcepub fn success_with_message(data: T, message: impl Into<String>) -> Self
pub fn success_with_message(data: T, message: impl Into<String>) -> Self
Create a successful response with data and a human-readable message.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::success_with_message("done", "operation complete");
assert!(resp.success);
assert_eq!(resp.message, Some("operation complete".into()));Sourcepub fn ok() -> ApiResponse<()>
pub fn ok() -> ApiResponse<()>
Create a simple success response with no data.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::ok();
assert!(resp.success);
assert!(resp.data.is_none());Sourcepub fn ok_with_message(message: impl Into<String>) -> ApiResponse<()>
pub fn ok_with_message(message: impl Into<String>) -> ApiResponse<()>
Create a success response with a message but no data.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::ok_with_message("saved");
assert!(resp.success);
assert_eq!(resp.message, Some("saved".into()));Source§impl ApiResponse<()>
impl ApiResponse<()>
Sourcepub fn error(code: impl Into<String>, message: impl Into<String>) -> Self
pub fn error(code: impl Into<String>, message: impl Into<String>) -> Self
Create an error response with a code and message.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::error("BAD_REQUEST", "missing param");
assert!(!resp.success);
assert_eq!(resp.error.as_ref().unwrap().code, "BAD_REQUEST");Sourcepub fn error_with_details(
code: impl Into<String>,
message: impl Into<String>,
details: Value,
) -> Self
pub fn error_with_details( code: impl Into<String>, message: impl Into<String>, details: Value, ) -> Self
Create an error response with structured details.
§Example
use auth_framework::api::responses::ApiResponse;
let details = serde_json::json!({"fields": ["name"]});
let resp = ApiResponse::<()>::error_with_details("VALIDATION", "invalid", details);
assert!(resp.error.as_ref().unwrap().details.is_some());Sourcepub fn validation_error(message: impl Into<String>) -> Self
pub fn validation_error(message: impl Into<String>) -> Self
Create a validation error (400) response.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::validation_error("email is invalid");
assert_eq!(resp.error.as_ref().unwrap().code, "VALIDATION_ERROR");Create an unauthorized (401) error response.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::unauthorized();
assert_eq!(resp.error.as_ref().unwrap().code, "UNAUTHORIZED");Sourcepub fn forbidden() -> Self
pub fn forbidden() -> Self
Create a forbidden (403) error response.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::forbidden();
assert_eq!(resp.error.as_ref().unwrap().code, "FORBIDDEN");Sourcepub fn forbidden_with_message(message: impl Into<String>) -> Self
pub fn forbidden_with_message(message: impl Into<String>) -> Self
Create a forbidden (403) error with a custom message.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::forbidden_with_message("admin area");
assert_eq!(resp.error.as_ref().unwrap().message, "admin area");Sourcepub fn not_found(resource: impl Into<String>) -> Self
pub fn not_found(resource: impl Into<String>) -> Self
Create a not-found (404) error naming the missing resource.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::not_found("User");
assert!(resp.error.as_ref().unwrap().message.contains("not found"));Sourcepub fn not_found_with_message(message: impl Into<String>) -> Self
pub fn not_found_with_message(message: impl Into<String>) -> Self
Create a not-found (404) error with a custom message.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::not_found_with_message("deleted");
assert_eq!(resp.error.as_ref().unwrap().code, "NOT_FOUND");Sourcepub fn internal_error() -> Self
pub fn internal_error() -> Self
Create an internal server error (500) response.
§Example
use auth_framework::api::responses::ApiResponse;
let resp = ApiResponse::<()>::internal_error();
assert_eq!(resp.error.as_ref().unwrap().code, "SERVER_ERROR");Trait Implementations§
Source§impl<T: Debug> Debug for ApiResponse<T>
impl<T: Debug> Debug for ApiResponse<T>
Source§impl From<AuthError> for ApiResponse<()>
Convert an AuthError into an appropriate API error response.
impl From<AuthError> for ApiResponse<()>
Convert an AuthError into an appropriate API error response.
Maps error variants to HTTP-semantic error codes:
Token→INVALID_TOKENValidation→VALIDATION_ERRORAuthMethod→INVALID_CREDENTIALSUserNotFound→NOT_FOUNDPermission→FORBIDDENRateLimit→RATE_LIMITED- everything else →
SERVER_ERROR
Source§impl<T> IntoResponse for ApiResponse<T>where
T: Serialize,
impl<T> IntoResponse for ApiResponse<T>where
T: Serialize,
Source§fn into_response(self) -> Response
fn into_response(self) -> Response
Auto Trait Implementations§
impl<T> Freeze for ApiResponse<T>where
T: Freeze,
impl<T> RefUnwindSafe for ApiResponse<T>where
T: RefUnwindSafe,
impl<T> Send for ApiResponse<T>where
T: Send,
impl<T> Sync for ApiResponse<T>where
T: Sync,
impl<T> Unpin for ApiResponse<T>where
T: Unpin,
impl<T> UnsafeUnpin for ApiResponse<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for ApiResponse<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more