pub struct ApiResponse<T, C, D = ()> { /* private fields */ }Expand description
REST wire contract: {code,msg,data?,error?}.
Fields are private; constructors and deserialization enforce code/state consistency. This type has no web-framework dependency and never chooses a status, header or error message.
use aster_forge_api::response::{ApiResponse, ApiResponseCode};
#[derive(serde::Serialize)]
enum ProductCode { Success }
impl ApiResponseCode for ProductCode {
fn is_success(&self) -> bool { matches!(self, Self::Success) }
}
let response = ApiResponse::<_, ProductCode>::ok(ProductCode::Success, vec![1, 2])?;
assert_eq!(response.data(), Some(&vec![1, 2]));Callers cannot bypass state validation with a struct literal:
use aster_forge_api::response::ApiResponse;
let response = ApiResponse::<(), u8> {
code: 0, msg: String::new(), data: Some(()), error: None,
};Implementations§
Source§impl<T, C: ApiResponseCode, D> ApiResponse<T, C, D>
impl<T, C: ApiResponseCode, D> ApiResponse<T, C, D>
Sourcepub fn ok(code: C, data: T) -> Result<Self, ResponseEnvelopeError>
pub fn ok(code: C, data: T) -> Result<Self, ResponseEnvelopeError>
Builds success with data and an empty message, preserving a null-valued T as data.
§Errors
Returns ResponseEnvelopeError::SuccessCodeRequired for a failure code.
Sourcepub fn ok_with_message(
code: C,
message: impl Into<String>,
data: T,
) -> Result<Self, ResponseEnvelopeError>
pub fn ok_with_message( code: C, message: impl Into<String>, data: T, ) -> Result<Self, ResponseEnvelopeError>
Builds success with a product-provided message and data.
§Errors
Returns ResponseEnvelopeError::SuccessCodeRequired for a failure code.
Source§impl<C: ApiResponseCode, D> ApiResponse<(), C, D>
impl<C: ApiResponseCode, D> ApiResponse<(), C, D>
Sourcepub fn ok_empty(code: C) -> Result<Self, ResponseEnvelopeError>
pub fn ok_empty(code: C) -> Result<Self, ResponseEnvelopeError>
Builds success with an empty message and omitted data.
§Errors
Returns ResponseEnvelopeError::SuccessCodeRequired for a failure code.
Sourcepub fn error(
code: C,
message: impl Into<String>,
) -> Result<Self, ResponseEnvelopeError>
pub fn error( code: C, message: impl Into<String>, ) -> Result<Self, ResponseEnvelopeError>
Builds a failure with retryable: false and no diagnostic, matching AD’s ordinary error.
§Errors
Returns ResponseEnvelopeError::FailureCodeRequired for a success code.
Sourcepub fn error_with_details(
code: C,
message: impl Into<String>,
error: Option<ApiErrorInfo<D>>,
) -> Result<Self, ResponseEnvelopeError>
pub fn error_with_details( code: C, message: impl Into<String>, error: Option<ApiErrorInfo<D>>, ) -> Result<Self, ResponseEnvelopeError>
Builds a failure with optional product error metadata. None omits the error field.
§Errors
Returns ResponseEnvelopeError::FailureCodeRequired for a success code.
Source§impl<C: ApiResponseCode, D> ApiResponse<ApiEmptyData, C, D>
impl<C: ApiResponseCode, D> ApiResponse<ApiEmptyData, C, D>
Sourcepub fn ok_empty_data(code: C) -> Result<Self, ResponseEnvelopeError>
pub fn ok_empty_data(code: C) -> Result<Self, ResponseEnvelopeError>
Builds success with data: {} and an empty message.
§Errors
Returns ResponseEnvelopeError::SuccessCodeRequired for a failure code.
Source§impl<T, C, D> ApiResponse<T, C, D>
impl<T, C, D> ApiResponse<T, C, D>
Sourcepub fn into_data(self) -> Option<T>
pub fn into_data(self) -> Option<T>
Consumes the envelope and returns its optional data payload.
Sourcepub const fn error_info(&self) -> Option<&ApiErrorInfo<D>>
pub const fn error_info(&self) -> Option<&ApiErrorInfo<D>>
Optional product error metadata.
Trait Implementations§
Source§impl<T: Clone, C: Clone, D: Clone> Clone for ApiResponse<T, C, D>
impl<T: Clone, C: Clone, D: Clone> Clone for ApiResponse<T, C, D>
Source§fn clone(&self) -> ApiResponse<T, C, D>
fn clone(&self) -> ApiResponse<T, C, D>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: ToSchema, C: ToSchema, D: ToSchema> ComposeSchema for ApiResponse<T, C, D>
impl<T: ToSchema, C: ToSchema, D: ToSchema> ComposeSchema for ApiResponse<T, C, D>
Source§impl<'de, T, C, D> Deserialize<'de> for ApiResponse<T, C, D>
impl<'de, T, C, D> Deserialize<'de> for ApiResponse<T, C, D>
Source§fn deserialize<E: Deserializer<'de>>(deserializer: E) -> Result<Self, E::Error>
fn deserialize<E: Deserializer<'de>>(deserializer: E) -> Result<Self, E::Error>
Source§impl<T, C, D> Serialize for ApiResponse<T, C, D>
impl<T, C, D> Serialize for ApiResponse<T, C, D>
Source§impl<T: ToSchema, C: ToSchema, D: ToSchema> ToSchema for ApiResponse<T, C, D>
impl<T: ToSchema, C: ToSchema, D: ToSchema> ToSchema for ApiResponse<T, C, D>
impl<T: Eq, C: Eq, D: Eq> Eq for ApiResponse<T, C, D>
impl<T, C, D> StructuralPartialEq for ApiResponse<T, C, D>
Auto Trait Implementations§
impl<T, C, D> Freeze for ApiResponse<T, C, D>
impl<T, C, D> RefUnwindSafe for ApiResponse<T, C, D>
impl<T, C, D> Send for ApiResponse<T, C, D>
impl<T, C, D> Sync for ApiResponse<T, C, D>
impl<T, C, D> Unpin for ApiResponse<T, C, D>
impl<T, C, D> UnsafeUnpin for ApiResponse<T, C, D>
impl<T, C, D> UnwindSafe for ApiResponse<T, C, D>
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.