diff options
Diffstat (limited to 'src/jaegertracing/thrift/lib/rs/src/server/mod.rs')
-rw-r--r-- | src/jaegertracing/thrift/lib/rs/src/server/mod.rs | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/jaegertracing/thrift/lib/rs/src/server/mod.rs b/src/jaegertracing/thrift/lib/rs/src/server/mod.rs new file mode 100644 index 000000000..b719d1ba8 --- /dev/null +++ b/src/jaegertracing/thrift/lib/rs/src/server/mod.rs @@ -0,0 +1,123 @@ +// 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. + +//! Types used to implement a Thrift server. + +use protocol::{TInputProtocol, TMessageIdentifier, TMessageType, TOutputProtocol}; +use {ApplicationError, ApplicationErrorKind}; + +mod multiplexed; +mod threaded; + +pub use self::multiplexed::TMultiplexedProcessor; +pub use self::threaded::TServer; + +/// Handles incoming Thrift messages and dispatches them to the user-defined +/// handler functions. +/// +/// An implementation is auto-generated for each Thrift service. When used by a +/// server (for example, a `TSimpleServer`), it will demux incoming service +/// calls and invoke the corresponding user-defined handler function. +/// +/// # Examples +/// +/// Create and start a server using the auto-generated `TProcessor` for +/// a Thrift service `SimpleService`. +/// +/// ```no_run +/// use thrift::protocol::{TInputProtocol, TOutputProtocol}; +/// use thrift::server::TProcessor; +/// +/// // +/// // auto-generated +/// // +/// +/// // processor for `SimpleService` +/// struct SimpleServiceSyncProcessor; +/// impl SimpleServiceSyncProcessor { +/// fn new<H: SimpleServiceSyncHandler>(processor: H) -> SimpleServiceSyncProcessor { +/// unimplemented!(); +/// } +/// } +/// +/// // `TProcessor` implementation for `SimpleService` +/// impl TProcessor for SimpleServiceSyncProcessor { +/// fn process(&self, i: &mut TInputProtocol, o: &mut TOutputProtocol) -> thrift::Result<()> { +/// unimplemented!(); +/// } +/// } +/// +/// // service functions for SimpleService +/// trait SimpleServiceSyncHandler { +/// fn service_call(&self) -> thrift::Result<()>; +/// } +/// +/// // +/// // user-code follows +/// // +/// +/// // define a handler that will be invoked when `service_call` is received +/// struct SimpleServiceHandlerImpl; +/// impl SimpleServiceSyncHandler for SimpleServiceHandlerImpl { +/// fn service_call(&self) -> thrift::Result<()> { +/// unimplemented!(); +/// } +/// } +/// +/// // instantiate the processor +/// let processor = SimpleServiceSyncProcessor::new(SimpleServiceHandlerImpl {}); +/// +/// // at this point you can pass the processor to the server +/// // let server = TServer::new(..., processor); +/// ``` +pub trait TProcessor { + /// Process a Thrift service call. + /// + /// Reads arguments from `i`, executes the user's handler code, and writes + /// the response to `o`. + /// + /// Returns `()` if the handler was executed; `Err` otherwise. + fn process(&self, i: &mut dyn TInputProtocol, o: &mut dyn TOutputProtocol) -> ::Result<()>; +} + +/// Convenience function used in generated `TProcessor` implementations to +/// return an `ApplicationError` if thrift message processing failed. +pub fn handle_process_result( + msg_ident: &TMessageIdentifier, + res: ::Result<()>, + o_prot: &mut dyn TOutputProtocol, +) -> ::Result<()> { + if let Err(e) = res { + let e = match e { + ::Error::Application(a) => a, + _ => ApplicationError::new(ApplicationErrorKind::Unknown, format!("{:?}", e)), + }; + + let ident = TMessageIdentifier::new( + msg_ident.name.clone(), + TMessageType::Exception, + msg_ident.sequence_number, + ); + + o_prot.write_message_begin(&ident)?; + ::Error::write_application_error_to_out_protocol(&e, o_prot)?; + o_prot.write_message_end()?; + o_prot.flush() + } else { + Ok(()) + } +} |