Import grpcio 0.6.0
And add metadata files using the following command:
get_rust_pkg.py --add3prf -v grpcio-0.6.0 -o grpcio
Test: none
Change-Id: I53cc0feb5c9d24eacb62331b968cab4ec85f60a6
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..f12ffa4
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,92 @@
+// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
+
+use std::{error, fmt, result};
+
+use crate::call::RpcStatus;
+use crate::grpc_sys::grpc_call_error;
+
+#[cfg(feature = "prost-codec")]
+use prost::DecodeError;
+#[cfg(feature = "protobuf-codec")]
+use protobuf::ProtobufError;
+
+/// Errors generated from this library.
+#[derive(Debug)]
+pub enum Error {
+ /// Codec error.
+ Codec(Box<dyn error::Error + Send + Sync>),
+ /// Failed to start an internal async call.
+ CallFailure(grpc_call_error),
+ /// Rpc request fail.
+ RpcFailure(RpcStatus),
+ /// Try to write to a finished rpc call.
+ RpcFinished(Option<RpcStatus>),
+ /// Remote is stopped.
+ RemoteStopped,
+ /// Failed to shutdown.
+ ShutdownFailed,
+ /// Failed to bind.
+ BindFail(String, u16),
+ /// gRPC completion queue is shutdown.
+ QueueShutdown,
+ /// Failed to create Google default credentials.
+ GoogleAuthenticationFailed,
+ /// Invalid format of metadata.
+ InvalidMetadata(String),
+}
+
+impl fmt::Display for Error {
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Error::RpcFailure(RpcStatus { status, details }) => match details {
+ Some(details) => write!(fmt, "RpcFailure: {} {}", status, details),
+ None => write!(fmt, "RpcFailure: {}", status),
+ },
+ other_error => write!(fmt, "{:?}", other_error),
+ }
+ }
+}
+
+impl error::Error for Error {
+ fn source(&self) -> Option<&(dyn error::Error + 'static)> {
+ match *self {
+ Error::Codec(ref e) => Some(e.as_ref()),
+ _ => None,
+ }
+ }
+}
+
+#[cfg(feature = "protobuf-codec")]
+impl From<ProtobufError> for Error {
+ fn from(e: ProtobufError) -> Error {
+ Error::Codec(Box::new(e))
+ }
+}
+
+#[cfg(feature = "prost-codec")]
+impl From<DecodeError> for Error {
+ fn from(e: DecodeError) -> Error {
+ Error::Codec(Box::new(e))
+ }
+}
+
+/// Type alias to use this library's [`Error`] type in a `Result`.
+pub type Result<T> = result::Result<T, Error>;
+
+#[cfg(all(test, feature = "protobuf-codec"))]
+mod tests {
+ use std::error::Error as StdError;
+
+ use protobuf::error::WireError;
+ use protobuf::ProtobufError;
+
+ use super::Error;
+
+ #[test]
+ fn test_convert() {
+ let error = ProtobufError::WireError(WireError::UnexpectedEof);
+ let e: Error = error.into();
+ assert_eq!(e.to_string(), "Codec(WireError(UnexpectedEof))");
+ assert!(e.source().is_some());
+ }
+}