Expand description
§Resp Result
Help data structure for web framework response
§Why
Resultwill become500using as web framework response type whenErr(_), the action usually not I expect- using non-Result type as web framework response type cannot using
?, the code will fill withif letormatch
that why I need a RespResult, which can
- control respond code or other message when it become
RespResult::Err, not always500 - impl the
Trythus can using friendly?to simplify code
note: because the
Trynot stable yet, this crate needNightlyrust
§Usage
§Install
add resp-result into your crate
[dependencies]
resp-result = "*"§feature flags
-
for-axum: enable axum support, that will implIntoResponseforRespResult -
for-actixeable actix-web support, that will implResponderforRespResult -
extra-error: enable extra error message in traitRespError -
tracing: enable recorder using tracing -
axum-full: equal tofor-axum+extra-error -
actix-full: equal tofor-actix+extra-error -
nightly_try_v2: implTryforRespResultmaking it can using?, it will enable feature try_trait_v2 and require Nightly rust compiler
§Define an Error
RespResult<T,E> require the E impl the RespError
for example
use resp_result::{RespError, RespResult};
use std::borrow::Cow;
use http::StatusCode;
pub struct PlainError(String);
impl RespError for PlainError{
fn log_message(&self) -> Cow<'_, str> {
Cow::Owned(format!("PlainError: {}", self.0))
}
fn resp_message(&self) -> Cow<'_, str> {
"PlainError".into()
}
fn http_code(&self) -> StatusCode {
StatusCode::BAD_REQUEST
}
type ExtraMessage = String;
fn extra_message(&self) -> Self::ExtraMessage {
self.0.clone()
}
}
/// this can be use as handler return type
type PlainRResult<T> = RespResult<T, PlainError>;§Bound of T in RespResult<T, E>
The T require implement Serialize and has 'static lifetime
§Using it
the following is an example for using RespResult
use resp_result::{RespError, RespResult};
use std::borrow::Cow;
use http::StatusCode;
pub struct PlainError(String);
impl RespError for PlainError{
fn log_message(&self) -> Cow<'_, str> {
Cow::Owned(format!("PlainError: {}", self.0))
}
type ExtraMessage = String;
fn extra_message(&self) -> Self::ExtraMessage {
self.0.clone()
}
}
/// this can be use as handler return type
type PlainRResult<T> = RespResult<T, PlainError>;
pub async fn welcome_short_name(name: String) -> PlainRResult<String>{
if name.len() >= 8{
// you can using `?` just like the function that return `Result`
Err(PlainError("the name size great then 8".to_string()))?;
}
if name.len() >= 4 {
// `Result::Ok` can convert into `RespResult::Success` just using `into`
Ok(format!("welcome! {name} with size great then 4")).into()
}else{
// or just direct using `RespResult::ok`
RespResult::ok(format!("welcome! {name}"))
}
}§ExtraFlag and ExtraFlags
In general the RespResult::Success is always generate response with status code 200 OK and using serde_json serialize the body into json. But sometimes we want return an
304 Not Modified with empty body to tell the client the resource do not change. To support above using situation, comes out the ExtraFlag and ExtraFlags
§Extra Flag
extra flag have 4 different type can bring different effect on response
empty_body: this flag will stopRespResultperform serialize into response bodystatus: this flag will overwriteStatusCodeof responseset-header: this flag will insert or append provide header into response header mapremove-header: this flag will remove header from response header map
different extra flags can using + to combine effect or += to adding effect
§Extra Flags
extra flags is a set of extra flag
§FlagWrap
flag wrap provide a wrap to send extra flag
when using extra flag, you need change return type from RespResult<T, E> to RespResult<FlagWrap<T>, E>
the follow example change Status Code to 404 Not Found
use resp_result::{RespError, RespResult, FlagWrap, ExtraFlag};
use std::borrow::Cow;
use http::StatusCode;
pub struct PlainError(String);
impl RespError for PlainError{
fn log_message(&self) -> Cow<'_, str> {
Cow::Owned(format!("PlainError: {}", self.0))
}
type ExtraMessage = String;
fn extra_message(&self) -> Self::ExtraMessage {
self.0.clone()
}
}
/// this can be use as handler return type
type PlainRResult<T> = RespResult<T, PlainError>;
pub async fn welcome_short_name(
name: String,
) -> PlainRResult<FlagWrap<String>>{
if name.len() >= 8{
RespResult::ok(
format!("welcome! {name} your name size is {}",name.len()))
// using `with_flags` to covert RespResult<T, E>
// to `RespResult<FlagWrap<T>, E>`
// using `()` for no extra flags
.with_flags(())
}else{
// suing `flag_ok` direct construct a flag with resp result
RespResult::flag_ok(
format!("Welcome! {name}"),
ExtraFlag::status(StatusCode::NOT_FOUND)
)
}
}§Effect RespResult behavior
by default the RespResult will serialize the response body like that
{
"is-ok": true,
"error-message": "...",
"extra-msg": "...",
"body": null
}the default behavior can be changed by using set_config to set global configuration
for example, by config, we can change response body into following
{
"status": "fail",
"reterror": 10001,
"message": "something wrong",
"body": null
}Modules§
Macros§
- rtry
- similar to the try macro, but for RespResult
Structs§
- Default
Config - config that apply all default config
- Extra
Flags - a set of extra flags
can using
+or+=combine multipleExtraFlag - Flag
Wrap - an wrap for adding extra flags.
the
FlagWrapif and only if using like following - MapReject
- Nil
- SetResp
Result Configure Error - Status
Sign - the full info of status sign
Enums§
- Extra
Flag - the basic flag that can be using
- Header
Type - the action of set header
- Resp
Result - resp result for more flexible control the response body
- Sign
Type - the type of the sign
Traits§
- Config
Trait - the config trait that giving for
set_config - From
Request Family - Into
Resp Result - convert into
RespResult - Into
Resp Result With Err - convert into
RespResultwith provide error - Resp
Config - the config of response
- Resp
Error - the error when
RespResultisErr(_) - Serde
Config - the config information of serialize
- ToInner
Functions§
- resp_
try - receive a Future applying it immediately, then convent the result into RespResult
- set_
config - set the
RespResultconfig, will change the action on generate response body - try_
set_ config