Expand description
Assets for implementation of the gRPC Richer Error Model with tonic.
This crate introduces the WithErrorDetails trait and implements it in
tonic::Status, allowing the implementation of the gRPC Richer Error Model
with tonic in a convenient way.
§Usage
The WithErrorDetails trait adds associated functions to tonic::Status
that can be used on the server side to create a status with error details, that
can then be returned to the gRPC client. Moreover, the trait also adds methods
to tonic::Status that can be used by a tonic client to extract error
details, and handle them with ease.
§Getting Started
To build this crate you must have the Protocol Buffer Compiler, protoc,
installed. Instructions can be found here.
[dependencies]
tonic = "0.8"
tonic-richer-error = "0.3"§Examples
The examples bellow cover a basic use case. More complete server and client implementations can be found at the github examples directory.
§Server Side: Generating tonic::Status with an ErrorDetails struct
use tonic::{Code, Status};
use tonic_richer_error::{ErrorDetails, WithErrorDetails};
// ...
// Inside a gRPC server endpoint that returns `Result<Response<T>, Status>`
// Create empty `ErrorDetails` struct
let mut err_details = ErrorDetails::new();
// Add error details conditionally
if some_condition {
err_details.add_bad_request_violation(
"field_a",
"description of why the field_a is invalid"
);
}
if other_condition {
err_details.add_bad_request_violation(
"field_b",
"description of why the field_b is invalid",
);
}
// Check if any error details were set and return error status if so
if err_details.has_bad_request_violations() {
// Add additional error details if necessary
err_details
.add_help_link("description of link", "https://resource.example.local")
.set_localized_message("en-US", "message for the user");
let status = Status::with_error_details(
Code::InvalidArgument,
"bad request",
err_details,
);
return Err(status);
}
// Handle valid request
// ...
§Client Side: Extracting an ErrorDetails struct from tonic::Status
use tonic::{Response, Status};
use tonic_richer_error::{WithErrorDetails};
// ...
// Where `req_result` was returned by a gRPC client endpoint method
fn handle_request_result<T>(req_result: Result<Response<T>, Status>) {
match req_result {
Ok(response) => {
// Handle successful response
},
Err(status) => {
let err_details = status.get_error_details();
if let Some(bad_request) = err_details.bad_request {
// Handle bad_request details
}
if let Some(help) = err_details.help {
// Handle help details
}
if let Some(localized_message) = err_details.localized_message {
// Handle localized_message details
}
}
};
}§Send different standard error messages
Multiple examples are provided at the ErrorDetails doc. Instructions about
how to use the fields of the standard error message types correctly are
provided at error_details.proto.
§Alternative tonic::Status associated functions and methods
In the WithErrorDetails doc, an alternative way of interacting with
tonic::Status is presented, using vectors of error details structs wrapped
with the ErrorDetail enum. This approach can provide more control over the
vector of standard error messages that will be generated or that was received,
if necessary. To see how to adopt this approach, please check the
WithErrorDetails::with_error_details_vec and
WithErrorDetails::get_error_details_vec docs, and also the
github examples directory.\
Besides that, multiple examples with alternative error details extraction
methods are provided in the WithErrorDetails doc, which can be specially
useful if only one type of standard error message is being handled by the
client. For example, using WithErrorDetails::get_details_bad_request is a
more direct way of extracting a BadRequest error message from
tonic::Status.
Modules§
- pb
- Compiled
google.rpcprotos
Structs§
- BadRequest
- Used to encode/decode the
BadRequeststandard error message described in error_details.proto. Describes violations in a client request. Focuses on the syntactic aspects of the request. - Debug
Info - Used to encode/decode the
DebugInfostandard error message described in error_details.proto. Describes additional debugging info. - Error
Details - Groups the standard error messages structs. Provides associated
functions and methods to setup and edit each error message independently.
Used when extracting error details from
tonic::Status, and when creating atonic::Statuswith error details. - Error
Info - Used to encode/decode the
ErrorInfostandard error message described in error_details.proto. Describes the cause of the error with structured details. - Field
Violation - Used at the
field_violationsfield of theBadRequeststruct. Describes a single bad request field. - Help
- Used to encode/decode the
Helpstandard error message described in error_details.proto. Provides links to documentation or for performing an out-of-band action. - Help
Link - Used at the
linksfield of theHelpstruct. Describes a URL link. - Localized
Message - Used to encode/decode the
LocalizedMessagestandard error message described in error_details.proto. Provides a localized error message that is safe to return to the user. - Precondition
Failure - Used to encode/decode the
PreconditionFailurestandard error message described in error_details.proto. Describes what preconditions have failed. - Precondition
Violation - Used at the
violationsfield of thePreconditionFailurestruct. Describes a single precondition failure. - Quota
Failure - Used to encode/decode the
QuotaFailurestandard error message described in error_details.proto. Describes how a quota check failed. - Quota
Violation - Used at the
violationsfield of theQuotaFailurestruct. Describes a single quota violation. - Request
Info - Used to encode/decode the
RequestInfostandard error message described in error_details.proto. Contains metadata about the request that clients can attach when providing feedback. - Resource
Info - Used to encode/decode the
ResourceInfostandard error message described in error_details.proto. Describes the resource that is being accessed. - Retry
Info - Used to encode/decode the
RetryInfostandard error message described in error_details.proto. Describes when the clients can retry a failed request.
Note: When obtained from decodingRetryInfomessages, negativeretry_delay’s become 0.
Enums§
- Error
Detail - Wraps the structs corresponding to the standard error messages, allowing the implementation and handling of vectors containing any of them.
Traits§
- With
Error Details - Used to implement associated functions and methods on
tonic::Status, that allow the addition and extraction of standard error details.