pub trait StatusExt {
    fn with_error_details_and_metadata(
        code: Code,
        message: impl Into<String>,
        details: ErrorDetails,
        metadata: MetadataMap
    ) -> Status; fn with_error_details(
        code: Code,
        message: impl Into<String>,
        details: ErrorDetails
    ) -> Status; fn with_error_details_vec_and_metadata(
        code: Code,
        message: impl Into<String>,
        details: impl IntoIterator<Item = ErrorDetail>,
        metadata: MetadataMap
    ) -> Status; fn with_error_details_vec(
        code: Code,
        message: impl Into<String>,
        details: impl IntoIterator<Item = ErrorDetail>
    ) -> Status; fn check_error_details(&self) -> Result<ErrorDetails, DecodeError>; fn get_error_details(&self) -> ErrorDetails; fn check_error_details_vec(&self) -> Result<Vec<ErrorDetail>, DecodeError>; fn get_error_details_vec(&self) -> Vec<ErrorDetail>; fn get_details_bad_request(&self) -> Option<BadRequest>; }
Expand description

Used to implement associated functions and methods on tonic::Status, that allow the addition and extraction of standard error details.

Required Methods§

Generates a tonic::Status with error details obtained from an ErrorDetails struct, and custom metadata.

Examples
use tonic::{metadata::MetadataMap, Code, Status};
use tonic_types::{ErrorDetails, StatusExt};

let status = Status::with_error_details_and_metadata(
    Code::InvalidArgument,
    "bad request",
    ErrorDetails::with_bad_request_violation("field", "description"),
    MetadataMap::new()
);

Generates a tonic::Status with error details obtained from an ErrorDetails struct.

Examples
use tonic::{Code, Status};
use tonic_types::{ErrorDetails, StatusExt};

let status = Status::with_error_details(
    Code::InvalidArgument,
    "bad request",
    ErrorDetails::with_bad_request_violation("field", "description"),
);

Generates a tonic::Status with error details provided in a vector of ErrorDetail enums, and custom metadata.

Examples
use tonic::{metadata::MetadataMap, Code, Status};
use tonic_types::{BadRequest, StatusExt};

let status = Status::with_error_details_vec_and_metadata(
    Code::InvalidArgument,
    "bad request",
    vec![
        BadRequest::with_violation("field", "description").into(),
    ],
    MetadataMap::new()
);

Generates a tonic::Status with error details provided in a vector of ErrorDetail enums.

Examples
use tonic::{Code, Status};
use tonic_types::{BadRequest, StatusExt};

let status = Status::with_error_details_vec(
    Code::InvalidArgument,
    "bad request",
    vec![
        BadRequest::with_violation("field", "description").into(),
    ]
);

Can be used to check if the error details contained in tonic::Status are malformed or not. Tries to get an ErrorDetails struct from a tonic::Status. If some prost::DecodeError occurs, it will be returned. If not debugging, consider using StatusExt::get_error_details or StatusExt::get_error_details_vec.

Examples
use tonic::{Status, Response};
use tonic_types::{StatusExt};

fn handle_request_result<T>(req_result: Result<Response<T>, Status>) {
    match req_result {
        Ok(_) => {},
        Err(status) => {
            let err_details = status.get_error_details();
            if let Some(bad_request) = err_details.bad_request() {
                // Handle bad_request details
            }
            // ...
        }
    };
}

Get an ErrorDetails struct from tonic::Status. If some prost::DecodeError occurs, an empty ErrorDetails struct will be returned.

Examples
use tonic::{Status, Response};
use tonic_types::{StatusExt};

fn handle_request_result<T>(req_result: Result<Response<T>, Status>) {
    match req_result {
        Ok(_) => {},
        Err(status) => {
            let err_details = status.get_error_details();
            if let Some(bad_request) = err_details.bad_request() {
                // Handle bad_request details
            }
            // ...
        }
    };
}

Can be used to check if the error details contained in tonic::Status are malformed or not. Tries to get a vector of ErrorDetail enums from a tonic::Status. If some prost::DecodeError occurs, it will be returned. If not debugging, consider using StatusExt::get_error_details_vec or StatusExt::get_error_details.

Examples
use tonic::{Status, Response};
use tonic_types::{ErrorDetail, StatusExt};

fn handle_request_result<T>(req_result: Result<Response<T>, Status>) {
    match req_result {
        Ok(_) => {},
        Err(status) => {
            match status.check_error_details_vec() {
                Ok(err_details) => {
                    // Handle extracted details
                }
                Err(decode_error) => {
                    // Handle decode_error
                }
            }
        }
    };
}

Get a vector of ErrorDetail enums from tonic::Status. If some prost::DecodeError occurs, an empty vector will be returned.

Examples
use tonic::{Status, Response};
use tonic_types::{ErrorDetail, StatusExt};

fn handle_request_result<T>(req_result: Result<Response<T>, Status>) {
    match req_result {
        Ok(_) => {},
        Err(status) => {
            let err_details = status.get_error_details_vec();
            for err_detail in err_details.iter() {
                 match err_detail {
                    ErrorDetail::BadRequest(bad_request) => {
                        // Handle bad_request details
                    }
                    // ...
                    _ => {}
                 }
            }
        }
    };
}

Get first BadRequest details found on tonic::Status, if any. If some prost::DecodeError occurs, returns None.

Examples
use tonic::{Status, Response};
use tonic_types::{StatusExt};

fn handle_request_result<T>(req_result: Result<Response<T>, Status>) {
    match req_result {
        Ok(_) => {},
        Err(status) => {
            if let Some(bad_request) = status.get_details_bad_request() {
                // Handle bad_request details
            }
        }
    };
}

Implementations on Foreign Types§

Implementors§