[ https://issues.apache.org/jira/browse/THRIFT-2945?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15833220#comment-15833220 ]
ASF GitHub Bot commented on THRIFT-2945: ---------------------------------------- Github user anatol commented on a diff in the pull request: https://github.com/apache/thrift/pull/1147#discussion_r97210872 --- Diff: lib/rs/src/errors.rs --- @@ -0,0 +1,678 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::convert::{From, Into}; +use std::error::Error as StdError; +use std::fmt::{Debug, Display, Formatter}; +use std::{error, fmt, io, string}; +use try_from::TryFrom; + +use ::protocol::{TFieldIdentifier, TInputProtocol, TOutputProtocol, TStructIdentifier, TType}; + +// FIXME: should all my error structs impl error::Error as well? +// FIXME: should all fields in TransportError, ProtocolError and ApplicationError be optional? + +/// Thrift error type. +/// +/// The error type defined here is used throughout this crate as well as in +/// all Thrift-compiler-generated Rust code. It falls into one of four +/// standard (i.e. defined by convention in Thrift implementations) categories. +/// These are: +/// +/// 1. **Transport errors**: errors encountered while writing byes to the I/O +/// channel. These include "connection closed", "bind errors", etc. +/// 2. **Protocol errors**: errors encountered when processing a Thrift message +/// within the thrift library. These include "exceeding size limits", +/// "unsupported protocol versions", etc. +/// 3. **Application errors**: errors encountered when Thrift-compiler-generated +/// 'application' code encounters conditions that violate the spec. These +/// include "out-of-order messages", "missing required-field values", etc. +/// This category also functions as a catch-all: any error returned by +/// handler functions is automatically encoded as an `ApplicationError` and +/// returned to the caller. +/// 4. **User errors**: exception structs defined within the Thrift IDL. +/// +/// With the exception of `Error::User`, each error variant encapsulates a +/// corresponding struct which encodes two required fields: +/// +/// 1. kind: an enum indicating what kind of error was encountered +/// 2. message: string with human-readable error information +/// +/// These two fields are encoded and sent over the wire to the remote. `kind` +/// is defined by convention while `message` is freeform. If none of the +/// enumerated error kinds seem suitable use the catch-all `Unknown`. +/// +/// # Examples +/// +/// Creating a `TransportError` explicitly. +/// +/// Conversions are defined from `thrift::TransportError`, `thrift::ProtocolError` +/// and `thrift::ApplicationError` to the corresponding `thrift::Error` variant +/// (see `err2` below). +/// +/// ``` +/// use thrift; +/// use thrift::{TransportError, TransportErrorKind}; +/// +/// let err0: thrift::Result<()> = Err( +/// thrift::Error::Transport( +/// TransportError { +/// kind: TransportErrorKind::TimedOut, +/// message: format!("connection to server timed out") +/// } +/// ) +/// ); +/// +/// let err1: thrift::Result<()> = Err( +/// thrift::Error::Transport( +/// TransportError::new( +/// TransportErrorKind::TimedOut, +/// format!("connection to server timed out") +/// ) +/// ) +/// ); +/// +/// let err2: thrift::Result<()> = Err( +/// thrift::Error::from( +/// TransportError::new( +/// TransportErrorKind::TimedOut, +/// format!("connection to server timed out") +/// ) +/// ) +/// ); +/// +/// ``` +/// +/// Creating an arbitrary error from a string +/// +/// ``` +/// use thrift; +/// use thrift::{ApplicationError, ApplicationErrorKind}; +/// +/// let err0: thrift::Result<()> = Err( +/// thrift::Error::from("This is an error") +/// ); +/// +/// // err0 is equivalent to... +/// +/// let err1: thrift::Result<()> = Err( +/// thrift::Error::Application( +/// ApplicationError::new( +/// ApplicationErrorKind::Unknown, +/// format!("This is an error") +/// ) +/// ) +/// ); +/// ``` +/// +/// Returning a user-defined (using the Thrift IDL) exception struct. +/// +/// ```text +/// // Thrift IDL exception definition. +/// exception Xception { +/// 1: i32 errorCode, +/// 2: string message +/// } +/// ``` +/// +/// ``` +/// use std::convert::From; +/// use std::error::Error; +/// use std::fmt; +/// use std::fmt::{Display, Formatter}; +/// +/// // auto-generated by the Thrift compiler +/// #[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] +/// pub struct Xception { +/// pub error_code: Option<i32>, +/// pub message: Option<String>, +/// } +/// +/// // auto-generated by the Thrift compiler +/// impl Error for Xception { +/// fn description(&self) -> &str { +/// "remote service threw Xception" +/// } +/// } +/// +/// // auto-generated by the Thrift compiler +/// impl From<Xception> for thrift::Error { +/// fn from(e: Xception) -> Self { +/// thrift::Error::User(Box::new(e)) +/// } +/// } +/// +/// // auto-generated by the Thrift compiler +/// impl Display for Xception { +/// fn fmt(&self, f: &mut Formatter) -> fmt::Result { +/// self.description().fmt(f) +/// } +/// } +/// +/// // in user code... +/// let err: thrift::Result<()> = Err( +/// thrift::Error::from(Xception { error_code: Some(1), message: None }) +/// ); +/// ``` +pub enum Error { + /// Errors encountered while writing byes to the I/O channel. + /// + /// These include "connection closed", "bind errors", etc. + Transport(TransportError), + /// Errors encountered when processing a Thrift message within the rift + /// library. + /// + /// These include "exceeding size limits", "unsupported protocol versions", + /// etc. + Protocol(ProtocolError), + /// Errors encountered when Thrift-compiler-generated 'application' code + /// encounters conditions that violate the spec. + /// + /// These include "out-of-order messages", "missing required-field values", + /// etc. This variant also functions as a catch-all: any error returned by + /// handler functions is automatically encoded as an `ApplicationError` and + /// returned to the caller. + Application(ApplicationError), + /// Carries exception structs defined within the Thrift IDL. + User(Box<error::Error + Sync + Send>), +} + +impl Error { + /// Read the wire representation of an application exception thrown by the + /// remote Thrift endpoint into its corresponding rift `ApplicationError` + /// representation. + /// + /// Application code should never call this method directly. + pub fn read_application_error_from_in_protocol(i: &mut TInputProtocol) + -> ::Result<ApplicationError> { + let mut message = "general remote error".to_owned(); + let mut kind = ApplicationErrorKind::Unknown; + + try!(i.read_struct_begin()); --- End diff -- It should probably use shorter and nicer `?` operator instead of `try!` macro. Here and everywhere else. I counted ~50 usages of `try!` macro. > Implement support for Rust language > ----------------------------------- > > Key: THRIFT-2945 > URL: https://issues.apache.org/jira/browse/THRIFT-2945 > Project: Thrift > Issue Type: New Feature > Components: Wish List > Reporter: Maksim Golov > Assignee: Jeremy Fitzhardinge > > Work on implementing support for Rust is in progress: > https://github.com/maximg/thrift by Simon GĂ©nier and myself. > It will probably take quite some time to complete. Please keep us updated if > there are changes related to our work. -- This message was sent by Atlassian JIRA (v6.3.4#6332)