You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by al...@apache.org on 2021/03/02 04:20:01 UTC

[thrift] branch master updated: Reformat rust code using 1.40 rustfmt and fail build if rustfmt fails (#2339)

This is an automated email from the ASF dual-hosted git repository.

allengeorge pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 55c3e4c  Reformat rust code using 1.40 rustfmt and fail build if rustfmt fails (#2339)
55c3e4c is described below

commit 55c3e4c2eff86b61eae1b098803e72d682bdaafb
Author: Allen George <al...@apache.org>
AuthorDate: Mon Mar 1 23:19:52 2021 -0500

    Reformat rust code using 1.40 rustfmt and fail build if rustfmt fails (#2339)
---
 .rustfmt.toml                          |  64 ----------
 Makefile.am                            |   2 +-
 lib/rs/Makefile.am                     |   2 +
 lib/rs/src/errors.rs                   |  11 +-
 lib/rs/src/lib.rs                      |   3 +-
 lib/rs/src/protocol/binary.rs          |  15 +--
 lib/rs/src/protocol/compact.rs         |   6 +-
 lib/rs/src/protocol/mod.rs             |  23 ++--
 lib/rs/src/protocol/multiplexed.rs     |   4 +-
 lib/rs/src/server/mod.rs               |   3 +-
 lib/rs/src/server/multiplexed.rs       |  16 ++-
 lib/rs/src/server/threaded.rs          |  14 ++-
 lib/rs/src/transport/buffered.rs       |   2 +-
 lib/rs/src/transport/mod.rs            |   7 +-
 lib/rs/test/Makefile.am                |   1 +
 rust-toolchain                         |   1 +
 test/rs/Makefile.am                    |   1 +
 test/rs/src/bin/test_client.rs         | 220 ++++++++++++++++-----------------
 test/rs/src/bin/test_server.rs         | 166 ++++++++++++-------------
 tutorial/rs/Makefile.am                |   1 +
 tutorial/rs/src/bin/tutorial_server.rs |   2 +-
 21 files changed, 256 insertions(+), 308 deletions(-)

diff --git a/.rustfmt.toml b/.rustfmt.toml
deleted file mode 100644
index dca5afd..0000000
--- a/.rustfmt.toml
+++ /dev/null
@@ -1,64 +0,0 @@
-max_width = 100
-hard_tabs = false
-tab_spaces = 4
-newline_style = "Auto"
-use_small_heuristics = "Default"
-indent_style = "Block"
-wrap_comments = false
-format_doc_comments = false
-comment_width = 80
-normalize_comments = false
-normalize_doc_attributes = false
-license_template_path = ""
-format_strings = false
-format_macro_matchers = false
-format_macro_bodies = true
-empty_item_single_line = true
-struct_lit_single_line = true
-fn_single_line = false
-where_single_line = false
-imports_indent = "Block"
-imports_layout = "Mixed"
-merge_imports = false
-reorder_imports = true
-reorder_modules = true
-reorder_impl_items = false
-type_punctuation_density = "Wide"
-space_before_colon = false
-space_after_colon = true
-spaces_around_ranges = false
-binop_separator = "Front"
-remove_nested_parens = true
-combine_control_expr = true
-overflow_delimited_expr = false
-struct_field_align_threshold = 0
-enum_discrim_align_threshold = 0
-match_arm_blocks = true
-force_multiline_blocks = false
-fn_args_density = "Tall"
-brace_style = "SameLineWhere"
-control_brace_style = "AlwaysSameLine"
-trailing_semicolon = true
-trailing_comma = "Vertical"
-match_block_trailing_comma = false
-blank_lines_upper_bound = 1
-blank_lines_lower_bound = 0
-edition = "2015"
-merge_derives = true
-use_try_shorthand = false
-use_field_init_shorthand = false
-force_explicit_abi = true
-condense_wildcard_suffixes = false
-color = "Auto"
-required_version = "1.0.0"
-unstable_features = false
-disable_all_formatting = false
-skip_children = false
-hide_parse_errors = false
-error_on_line_overflow = false
-error_on_unformatted = false
-report_todo = "Never"
-report_fixme = "Never"
-ignore = []
-emit_mode = "Files"
-make_backup = false
diff --git a/Makefile.am b/Makefile.am
index c5d9c41..3db9ffa 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -142,7 +142,6 @@ EXTRA_DIST = \
 	.gitattributes \
 	.gitignore \
 	.travis.yml \
-	.rustfmt.toml \
 	ApacheThrift.nuspec \
 	appveyor.yml \
 	bootstrap.sh \
@@ -165,5 +164,6 @@ EXTRA_DIST = \
 	package-lock.json \
 	phpcs.xml.dist \
 	README.md \
+	rust-toolchain \
 	sonar-project.properties \
 	Thrift.podspec
diff --git a/lib/rs/Makefile.am b/lib/rs/Makefile.am
index 6d74348..dd1c03b 100644
--- a/lib/rs/Makefile.am
+++ b/lib/rs/Makefile.am
@@ -31,9 +31,11 @@ install:
 	@echo '##############################################################'
 
 check-local:
+	$(CARGO) fmt --all -- --check
 	$(CARGO) test
 
 all-local:
+	$(CARGO) fmt --all -- --check
 	$(CARGO) build
 
 clean-local:
diff --git a/lib/rs/src/errors.rs b/lib/rs/src/errors.rs
index 41a055e..03d98cf 100644
--- a/lib/rs/src/errors.rs
+++ b/lib/rs/src/errors.rs
@@ -15,13 +15,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::convert::TryFrom;
 use std::convert::{From, Into};
 use std::error::Error as StdError;
 use std::fmt::{Debug, Display, Formatter};
 use std::{error, fmt, io, string};
-use std::convert::TryFrom;
 
-use crate::protocol::{TFieldIdentifier, TInputProtocol, TOutputProtocol, TStructIdentifier, TType};
+use crate::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?
@@ -235,10 +237,7 @@ impl Error {
 
         i.read_struct_end()?;
 
-        Ok(ApplicationError {
-            kind,
-            message,
-        })
+        Ok(ApplicationError { kind, message })
     }
 
     /// Convert an `ApplicationError` into its wire representation and write
diff --git a/lib/rs/src/lib.rs b/lib/rs/src/lib.rs
index f71c3e8..279690e 100644
--- a/lib/rs/src/lib.rs
+++ b/lib/rs/src/lib.rs
@@ -80,4 +80,5 @@ pub use crate::autogen::*;
 pub type Result<T> = std::result::Result<T, self::Error>;
 
 // Re-export ordered-float, since it is used by the generator
-pub use ordered_float::OrderedFloat as OrderedFloat;
\ No newline at end of file
+// FIXME: check the guidance around type reexports
+pub use ordered_float::OrderedFloat;
diff --git a/lib/rs/src/protocol/binary.rs b/lib/rs/src/protocol/binary.rs
index 22b496c..8509c34 100644
--- a/lib/rs/src/protocol/binary.rs
+++ b/lib/rs/src/protocol/binary.rs
@@ -68,10 +68,7 @@ where
     /// Set `strict` to `true` if all incoming messages contain the protocol
     /// version number in the protocol header.
     pub fn new(transport: T, strict: bool) -> TBinaryInputProtocol<T> {
-        TBinaryInputProtocol {
-            strict,
-            transport,
-        }
+        TBinaryInputProtocol { strict, transport }
     }
 }
 
@@ -294,10 +291,7 @@ where
     /// Set `strict` to `true` if all outgoing messages should contain the
     /// protocol version number in the protocol header.
     pub fn new(transport: T, strict: bool) -> TBinaryOutputProtocol<T> {
-        TBinaryOutputProtocol {
-            strict,
-            transport,
-        }
+        TBinaryOutputProtocol { strict, transport }
     }
 }
 
@@ -453,7 +447,10 @@ impl TBinaryOutputProtocolFactory {
 }
 
 impl TOutputProtocolFactory for TBinaryOutputProtocolFactory {
-    fn create(&self, transport: Box<dyn TWriteTransport + Send>) -> Box<dyn TOutputProtocol + Send> {
+    fn create(
+        &self,
+        transport: Box<dyn TWriteTransport + Send>,
+    ) -> Box<dyn TOutputProtocol + Send> {
         Box::new(TBinaryOutputProtocol::new(transport, true))
     }
 }
diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs
index f885e40..e08a30b 100644
--- a/lib/rs/src/protocol/compact.rs
+++ b/lib/rs/src/protocol/compact.rs
@@ -427,7 +427,8 @@ where
         self.write_byte(COMPACT_PROTOCOL_ID)?;
         self.write_byte((u8::from(identifier.message_type) << 5) | COMPACT_VERSION)?;
         // cast i32 as u32 so that varint writing won't use zigzag encoding
-        self.transport.write_varint(identifier.sequence_number as u32)?;
+        self.transport
+            .write_varint(identifier.sequence_number as u32)?;
         self.write_string(&identifier.name)?;
         Ok(())
     }
@@ -1091,6 +1092,7 @@ mod tests {
         let (mut i_prot, _) = test_objects();
 
         // signed two's complement of -1073741823 = 1100_0000_0000_0000_0000_0000_0000_0001
+        #[rustfmt::skip]
         let source_bytes: [u8; 11] = [
             0x82, /* protocol ID */
             0x21, /* message type | protocol version */
@@ -1102,7 +1104,7 @@ mod tests {
             0x03, /* message-name length */
             0x66,
             0x6F,
-            0x6F /* "foo" */,
+            0x6F, /* "foo" */
         ];
 
         i_prot.transport.set_readable_bytes(&source_bytes);
diff --git a/lib/rs/src/protocol/mod.rs b/lib/rs/src/protocol/mod.rs
index f9c1f72..e11a104 100644
--- a/lib/rs/src/protocol/mod.rs
+++ b/lib/rs/src/protocol/mod.rs
@@ -577,14 +577,18 @@ where
 /// ```
 pub trait TOutputProtocolFactory {
     /// Create a `TOutputProtocol` that writes bytes to `transport`.
-    fn create(&self, transport: Box<dyn TWriteTransport + Send>) -> Box<dyn TOutputProtocol + Send>;
+    fn create(&self, transport: Box<dyn TWriteTransport + Send>)
+        -> Box<dyn TOutputProtocol + Send>;
 }
 
 impl<T> TOutputProtocolFactory for Box<T>
 where
     T: TOutputProtocolFactory + ?Sized,
 {
-    fn create(&self, transport: Box<dyn TWriteTransport + Send>) -> Box<dyn TOutputProtocol + Send> {
+    fn create(
+        &self,
+        transport: Box<dyn TWriteTransport + Send>,
+    ) -> Box<dyn TOutputProtocol + Send> {
         (**self).create(transport)
     }
 }
@@ -679,10 +683,7 @@ impl TListIdentifier {
     /// Create a `TListIdentifier` for a list with `size` elements of type
     /// `element_type`.
     pub fn new(element_type: TType, size: i32) -> TListIdentifier {
-        TListIdentifier {
-            element_type,
-            size,
-        }
+        TListIdentifier { element_type, size }
     }
 }
 
@@ -699,10 +700,7 @@ impl TSetIdentifier {
     /// Create a `TSetIdentifier` for a set with `size` elements of type
     /// `element_type`.
     pub fn new(element_type: TType, size: i32) -> TSetIdentifier {
-        TSetIdentifier {
-            element_type,
-            size,
-        }
+        TSetIdentifier { element_type, size }
     }
 }
 
@@ -878,7 +876,10 @@ pub fn verify_expected_service_call(expected: &str, actual: &str) -> crate::Resu
 /// `actual`.
 ///
 /// Return `()` if `actual == expected`, `Err` otherwise.
-pub fn verify_expected_message_type(expected: TMessageType, actual: TMessageType) -> crate::Result<()> {
+pub fn verify_expected_message_type(
+    expected: TMessageType,
+    actual: TMessageType,
+) -> crate::Result<()> {
     if expected == actual {
         Ok(())
     } else {
diff --git a/lib/rs/src/protocol/multiplexed.rs b/lib/rs/src/protocol/multiplexed.rs
index 83498fb..697b7e6 100644
--- a/lib/rs/src/protocol/multiplexed.rs
+++ b/lib/rs/src/protocol/multiplexed.rs
@@ -191,7 +191,9 @@ where
 #[cfg(test)]
 mod tests {
 
-    use crate::protocol::{TBinaryOutputProtocol, TMessageIdentifier, TMessageType, TOutputProtocol};
+    use crate::protocol::{
+        TBinaryOutputProtocol, TMessageIdentifier, TMessageType, TOutputProtocol,
+    };
     use crate::transport::{TBufferChannel, TIoChannel, WriteHalf};
 
     use super::*;
diff --git a/lib/rs/src/server/mod.rs b/lib/rs/src/server/mod.rs
index 050feee..64c6da2 100644
--- a/lib/rs/src/server/mod.rs
+++ b/lib/rs/src/server/mod.rs
@@ -91,7 +91,8 @@ pub trait TProcessor {
     /// the response to `o`.
     ///
     /// Returns `()` if the handler was executed; `Err` otherwise.
-    fn process(&self, i: &mut dyn TInputProtocol, o: &mut dyn TOutputProtocol) -> crate::Result<()>;
+    fn process(&self, i: &mut dyn TInputProtocol, o: &mut dyn TOutputProtocol)
+        -> crate::Result<()>;
 }
 
 /// Convenience function used in generated `TProcessor` implementations to
diff --git a/lib/rs/src/server/multiplexed.rs b/lib/rs/src/server/multiplexed.rs
index 4f41f24..8331d91 100644
--- a/lib/rs/src/server/multiplexed.rs
+++ b/lib/rs/src/server/multiplexed.rs
@@ -136,7 +136,11 @@ impl TMultiplexedProcessor {
 }
 
 impl TProcessor for TMultiplexedProcessor {
-    fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) -> crate::Result<()> {
+    fn process(
+        &self,
+        i_prot: &mut dyn TInputProtocol,
+        o_prot: &mut dyn TOutputProtocol,
+    ) -> crate::Result<()> {
         let msg_ident = i_prot.read_message_begin()?;
 
         debug!("process incoming msg id:{:?}", &msg_ident);
@@ -183,7 +187,9 @@ mod tests {
     use std::sync::atomic::{AtomicBool, Ordering};
     use std::sync::Arc;
 
-    use crate::protocol::{TBinaryInputProtocol, TBinaryOutputProtocol, TMessageIdentifier, TMessageType};
+    use crate::protocol::{
+        TBinaryInputProtocol, TBinaryOutputProtocol, TMessageIdentifier, TMessageType,
+    };
     use crate::transport::{ReadHalf, TBufferChannel, TIoChannel, WriteHalf};
     use crate::{ApplicationError, ApplicationErrorKind};
 
@@ -261,7 +267,11 @@ mod tests {
     }
 
     impl TProcessor for Service {
-        fn process(&self, _: &mut dyn TInputProtocol, _: &mut dyn TOutputProtocol) -> crate::Result<()> {
+        fn process(
+            &self,
+            _: &mut dyn TInputProtocol,
+            _: &mut dyn TOutputProtocol,
+        ) -> crate::Result<()> {
             let res = self
                 .invoked
                 .compare_and_swap(false, true, Ordering::Relaxed);
diff --git a/lib/rs/src/server/threaded.rs b/lib/rs/src/server/threaded.rs
index 64bf8bb..897235c 100644
--- a/lib/rs/src/server/threaded.rs
+++ b/lib/rs/src/server/threaded.rs
@@ -21,7 +21,9 @@ use std::net::{TcpListener, TcpStream, ToSocketAddrs};
 use std::sync::Arc;
 use threadpool::ThreadPool;
 
-use crate::protocol::{TInputProtocol, TInputProtocolFactory, TOutputProtocol, TOutputProtocolFactory};
+use crate::protocol::{
+    TInputProtocol, TInputProtocolFactory, TOutputProtocol, TOutputProtocolFactory,
+};
 use crate::transport::{TIoChannel, TReadTransportFactory, TTcpChannel, TWriteTransportFactory};
 use crate::{ApplicationError, ApplicationErrorKind};
 
@@ -196,7 +198,10 @@ where
     fn new_protocols_for_connection(
         &mut self,
         stream: TcpStream,
-    ) -> crate::Result<(Box<dyn TInputProtocol + Send>, Box<dyn TOutputProtocol + Send>)> {
+    ) -> crate::Result<(
+        Box<dyn TInputProtocol + Send>,
+        Box<dyn TOutputProtocol + Send>,
+    )> {
         // create the shared tcp stream
         let channel = TTcpChannel::with_stream(stream);
 
@@ -227,10 +232,11 @@ fn handle_incoming_connection<PRC>(
     let mut o_prot = o_prot;
     loop {
         match processor.process(&mut *i_prot, &mut *o_prot) {
-            Ok(()) => {},
+            Ok(()) => {}
             Err(err) => {
                 match err {
-                    crate::Error::Transport(ref transport_err) if transport_err.kind == TransportErrorKind::EndOfFile => {},
+                    crate::Error::Transport(ref transport_err)
+                        if transport_err.kind == TransportErrorKind::EndOfFile => {}
                     other => warn!("processor completed with error: {:?}", other),
                 }
                 break;
diff --git a/lib/rs/src/transport/buffered.rs b/lib/rs/src/transport/buffered.rs
index ebdcdc2..a54f823 100644
--- a/lib/rs/src/transport/buffered.rs
+++ b/lib/rs/src/transport/buffered.rs
@@ -365,7 +365,7 @@ mod tests {
         assert_eq!(&buf, &[0, 1, 2, 3, 4, 5, 6, 7]);
 
         // let's clear out the buffer and try read again
-        for b in &mut buf{
+        for b in &mut buf {
             *b = 0;
         }
         let read_result = t.read(&mut buf);
diff --git a/lib/rs/src/transport/mod.rs b/lib/rs/src/transport/mod.rs
index d02a87c..2b5733f 100644
--- a/lib/rs/src/transport/mod.rs
+++ b/lib/rs/src/transport/mod.rs
@@ -111,7 +111,12 @@ pub trait TIoChannel: Read + Write {
     /// Returned halves may share the underlying OS channel or buffer resources.
     /// Implementations **should ensure** that these two halves can be safely
     /// used independently by concurrent threads.
-    fn split(self) -> crate::Result<(crate::transport::ReadHalf<Self>, crate::transport::WriteHalf<Self>)>
+    fn split(
+        self,
+    ) -> crate::Result<(
+        crate::transport::ReadHalf<Self>,
+        crate::transport::WriteHalf<Self>,
+    )>
     where
         Self: Sized;
 }
diff --git a/lib/rs/test/Makefile.am b/lib/rs/test/Makefile.am
index 5dc4f56..19056a6 100644
--- a/lib/rs/test/Makefile.am
+++ b/lib/rs/test/Makefile.am
@@ -28,6 +28,7 @@ stubs: thrifts/Base_One.thrift thrifts/Base_Two.thrift thrifts/Midlayer.thrift t
 	$(THRIFT) -out src --gen rs $(top_builddir)/test/Identifiers.thrift #THRIFT-4953
 
 check: stubs
+	$(CARGO) fmt --all -- --check
 	$(CARGO) build
 	$(CARGO) test
 	[ -d bin ] || mkdir bin
diff --git a/rust-toolchain b/rust-toolchain
new file mode 100644
index 0000000..32b7211
--- /dev/null
+++ b/rust-toolchain
@@ -0,0 +1 @@
+1.40.0
diff --git a/test/rs/Makefile.am b/test/rs/Makefile.am
index 4b061ea..afb2cad 100644
--- a/test/rs/Makefile.am
+++ b/test/rs/Makefile.am
@@ -22,6 +22,7 @@ stubs: ../ThriftTest.thrift
 
 precross: stubs
 	$(CARGO) build
+	$(CARGO) fmt --all -- --check
 	[ -d bin ] || mkdir bin
 	cp target/debug/test_server bin/test_server
 	cp target/debug/test_client bin/test_client
diff --git a/test/rs/src/bin/test_client.rs b/test/rs/src/bin/test_client.rs
index 476f9eb..8623915 100644
--- a/test/rs/src/bin/test_client.rs
+++ b/test/rs/src/bin/test_client.rs
@@ -15,22 +15,24 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use clap::{clap_app, value_t};
 use env_logger;
 use log::*;
-use clap::{clap_app, value_t};
 
 use std::collections::{BTreeMap, BTreeSet};
 use std::fmt::Debug;
 use std::net::TcpStream;
 
 use thrift;
+use thrift::protocol::{
+    TBinaryInputProtocol, TBinaryOutputProtocol, TCompactInputProtocol, TCompactOutputProtocol,
+    TInputProtocol, TMultiplexedOutputProtocol, TOutputProtocol,
+};
+use thrift::transport::{
+    TBufferedReadTransport, TBufferedWriteTransport, TFramedReadTransport, TFramedWriteTransport,
+    TIoChannel, TReadTransport, TTcpChannel, TWriteTransport,
+};
 use thrift::OrderedFloat;
-use thrift::protocol::{TBinaryInputProtocol, TBinaryOutputProtocol, TCompactInputProtocol,
-                       TCompactOutputProtocol, TInputProtocol, TMultiplexedOutputProtocol,
-                       TOutputProtocol};
-use thrift::transport::{TBufferedReadTransport, TBufferedWriteTransport,
-                        TFramedReadTransport, TFramedWriteTransport, TIoChannel, TReadTransport,
-                        TTcpChannel, TWriteTransport};
 use thrift_test::*;
 
 fn main() {
@@ -92,10 +94,7 @@ fn run() -> thrift::Result<()> {
 
     info!(
         "connecting to {}:{} with {}+{} stack",
-        host,
-        port,
-        protocol,
-        transport
+        host, port, protocol, transport
     );
 
     for _ in 0..testloops {
@@ -115,47 +114,50 @@ fn build(
     let (i_chan, o_chan) = c.split()?;
 
     let (i_tran, o_tran): (Box<dyn TReadTransport>, Box<dyn TWriteTransport>) = match transport {
-        "buffered" => {
-            (Box::new(TBufferedReadTransport::new(i_chan)),
-             Box::new(TBufferedWriteTransport::new(o_chan)))
-        }
-        "framed" => {
-            (Box::new(TFramedReadTransport::new(i_chan)),
-             Box::new(TFramedWriteTransport::new(o_chan)))
-        }
+        "buffered" => (
+            Box::new(TBufferedReadTransport::new(i_chan)),
+            Box::new(TBufferedWriteTransport::new(o_chan)),
+        ),
+        "framed" => (
+            Box::new(TFramedReadTransport::new(i_chan)),
+            Box::new(TFramedWriteTransport::new(o_chan)),
+        ),
         unmatched => return Err(format!("unsupported transport {}", unmatched).into()),
     };
 
     let (i_prot, o_prot): (Box<dyn TInputProtocol>, Box<dyn TOutputProtocol>) = match protocol {
-        "binary" => {
-            (Box::new(TBinaryInputProtocol::new(i_tran, true)),
-             Box::new(TBinaryOutputProtocol::new(o_tran, true)))
-        }
-        "multi" => {
-            (Box::new(TBinaryInputProtocol::new(i_tran, true)),
-             Box::new(
-                TMultiplexedOutputProtocol::new(
-                    service_name,
-                    TBinaryOutputProtocol::new(o_tran, true),
-                ),
-            ))
-        }
-        "compact" => {
-            (Box::new(TCompactInputProtocol::new(i_tran)),
-             Box::new(TCompactOutputProtocol::new(o_tran)))
-        }
-        "multic" => {
-            (Box::new(TCompactInputProtocol::new(i_tran)),
-             Box::new(TMultiplexedOutputProtocol::new(service_name, TCompactOutputProtocol::new(o_tran)),))
-        }
+        "binary" => (
+            Box::new(TBinaryInputProtocol::new(i_tran, true)),
+            Box::new(TBinaryOutputProtocol::new(o_tran, true)),
+        ),
+        "multi" => (
+            Box::new(TBinaryInputProtocol::new(i_tran, true)),
+            Box::new(TMultiplexedOutputProtocol::new(
+                service_name,
+                TBinaryOutputProtocol::new(o_tran, true),
+            )),
+        ),
+        "compact" => (
+            Box::new(TCompactInputProtocol::new(i_tran)),
+            Box::new(TCompactOutputProtocol::new(o_tran)),
+        ),
+        "multic" => (
+            Box::new(TCompactInputProtocol::new(i_tran)),
+            Box::new(TMultiplexedOutputProtocol::new(
+                service_name,
+                TCompactOutputProtocol::new(o_tran),
+            )),
+        ),
         unmatched => return Err(format!("unsupported protocol {}", unmatched).into()),
     };
 
     Ok((i_prot, o_prot))
 }
 
-type BuildThriftTestClient = ThriftTestSyncClient<Box<dyn TInputProtocol>, Box<dyn TOutputProtocol>>;
-type BuiltSecondServiceClient = SecondServiceSyncClient<Box<dyn TInputProtocol>, Box<dyn TOutputProtocol>>;
+type BuildThriftTestClient =
+    ThriftTestSyncClient<Box<dyn TInputProtocol>, Box<dyn TOutputProtocol>>;
+type BuiltSecondServiceClient =
+    SecondServiceSyncClient<Box<dyn TInputProtocol>, Box<dyn TOutputProtocol>>;
 
 #[allow(clippy::cognitive_complexity)]
 fn make_thrift_calls(
@@ -250,26 +252,22 @@ fn make_thrift_calls(
     {
         let x_snd = Xtruct2 {
             byte_thing: Some(32),
-            struct_thing: Some(
-                Xtruct {
-                    string_thing: Some("foo".to_owned()),
-                    byte_thing: Some(1),
-                    i32_thing: Some(324_382_098),
-                    i64_thing: Some(12_938_492_818),
-                },
-            ),
+            struct_thing: Some(Xtruct {
+                string_thing: Some("foo".to_owned()),
+                byte_thing: Some(1),
+                i32_thing: Some(324_382_098),
+                i64_thing: Some(12_938_492_818),
+            }),
             i32_thing: Some(293_481_098),
         };
         let x_cmp = Xtruct2 {
             byte_thing: Some(32),
-            struct_thing: Some(
-                Xtruct {
-                    string_thing: Some("foo".to_owned()),
-                    byte_thing: Some(1),
-                    i32_thing: Some(324_382_098),
-                    i64_thing: Some(12_938_492_818),
-                },
-            ),
+            struct_thing: Some(Xtruct {
+                string_thing: Some("foo".to_owned()),
+                byte_thing: Some(1),
+                i32_thing: Some(324_382_098),
+                i64_thing: Some(12_938_492_818),
+            }),
             i32_thing: Some(293_481_098),
         };
         verify_expected_result(thrift_test_client.test_nest(x_snd), x_cmp)?;
@@ -399,30 +397,24 @@ fn make_thrift_calls(
         arg_map_usermap.insert(Numberz::EIGHT, 19);
 
         let mut arg_vec_xtructs: Vec<Xtruct> = Vec::new();
-        arg_vec_xtructs.push(
-            Xtruct {
-                string_thing: Some("foo".to_owned()),
-                byte_thing: Some(8),
-                i32_thing: Some(29),
-                i64_thing: Some(92384),
-            },
-        );
-        arg_vec_xtructs.push(
-            Xtruct {
-                string_thing: Some("bar".to_owned()),
-                byte_thing: Some(28),
-                i32_thing: Some(2),
-                i64_thing: Some(-1281),
-            },
-        );
-        arg_vec_xtructs.push(
-            Xtruct {
-                string_thing: Some("baz".to_owned()),
-                byte_thing: Some(0),
-                i32_thing: Some(3_948_539),
-                i64_thing: Some(-12_938_492),
-            },
-        );
+        arg_vec_xtructs.push(Xtruct {
+            string_thing: Some("foo".to_owned()),
+            byte_thing: Some(8),
+            i32_thing: Some(29),
+            i64_thing: Some(92384),
+        });
+        arg_vec_xtructs.push(Xtruct {
+            string_thing: Some("bar".to_owned()),
+            byte_thing: Some(28),
+            i32_thing: Some(2),
+            i64_thing: Some(-1281),
+        });
+        arg_vec_xtructs.push(Xtruct {
+            string_thing: Some("baz".to_owned()),
+            byte_thing: Some(0),
+            i32_thing: Some(3_948_539),
+            i64_thing: Some(-12_938_492),
+        });
 
         let mut s_cmp_nested_1: BTreeMap<Numberz, Insanity> = BTreeMap::new();
         let insanity = Insanity {
@@ -450,12 +442,12 @@ fn make_thrift_calls(
     {
         let r = thrift_test_client.test_exception("Xception".to_owned());
         let x = match r {
-            Err(thrift::Error::User(ref e)) => {
-                match e.downcast_ref::<Xception>() {
-                    Some(x) => Ok(x),
-                    None => Err(thrift::Error::User("did not get expected Xception struct".into()),),
-                }
-            }
+            Err(thrift::Error::User(ref e)) => match e.downcast_ref::<Xception>() {
+                Some(x) => Ok(x),
+                None => Err(thrift::Error::User(
+                    "did not get expected Xception struct".into(),
+                )),
+            },
             _ => Err(thrift::Error::User("did not get exception".into())),
         }?;
 
@@ -493,12 +485,12 @@ fn make_thrift_calls(
         let r =
             thrift_test_client.test_multi_exception("Xception".to_owned(), "ignored".to_owned());
         let x = match r {
-            Err(thrift::Error::User(ref e)) => {
-                match e.downcast_ref::<Xception>() {
-                    Some(x) => Ok(x),
-                    None => Err(thrift::Error::User("did not get expected Xception struct".into()),),
-                }
-            }
+            Err(thrift::Error::User(ref e)) => match e.downcast_ref::<Xception>() {
+                Some(x) => Ok(x),
+                None => Err(thrift::Error::User(
+                    "did not get expected Xception struct".into(),
+                )),
+            },
             _ => Err(thrift::Error::User("did not get exception".into())),
         }?;
 
@@ -515,28 +507,26 @@ fn make_thrift_calls(
         let r =
             thrift_test_client.test_multi_exception("Xception2".to_owned(), "ignored".to_owned());
         let x = match r {
-            Err(thrift::Error::User(ref e)) => {
-                match e.downcast_ref::<Xception2>() {
-                    Some(x) => Ok(x),
-                    None => Err(thrift::Error::User("did not get expected Xception struct".into()),),
-                }
-            }
+            Err(thrift::Error::User(ref e)) => match e.downcast_ref::<Xception2>() {
+                Some(x) => Ok(x),
+                None => Err(thrift::Error::User(
+                    "did not get expected Xception struct".into(),
+                )),
+            },
             _ => Err(thrift::Error::User("did not get exception".into())),
         }?;
 
         let x_cmp = Xception2 {
             error_code: Some(2002),
-            struct_thing: Some(
-                Xtruct {
-                    string_thing: Some("This is an Xception2".to_owned()),
-                    // since this is an OPT_IN_REQ_OUT field the sender sets a default
-                    byte_thing: Some(0),
-                    // since this is an OPT_IN_REQ_OUT field the sender sets a default
-                    i32_thing: Some(0),
-                    // since this is an OPT_IN_REQ_OUT field the sender sets a default
-                    i64_thing: Some(0),
-                },
-            ),
+            struct_thing: Some(Xtruct {
+                string_thing: Some("This is an Xception2".to_owned()),
+                // since this is an OPT_IN_REQ_OUT field the sender sets a default
+                byte_thing: Some(0),
+                // since this is an OPT_IN_REQ_OUT field the sender sets a default
+                i32_thing: Some(0),
+                // since this is an OPT_IN_REQ_OUT field the sender sets a default
+                i64_thing: Some(0),
+            }),
         };
 
         verify_expected_result(Ok(x), &x_cmp)?;
@@ -546,7 +536,9 @@ fn make_thrift_calls(
     {
         let r = thrift_test_client.test_multi_exception("haha".to_owned(), "RETURNED".to_owned());
         let x = match r {
-            Err(e) => Err(thrift::Error::User(format!("received an unexpected exception {:?}", e).into(),),),
+            Err(e) => Err(thrift::Error::User(
+                format!("received an unexpected exception {:?}", e).into(),
+            )),
             _ => r,
         }?;
 
@@ -586,7 +578,9 @@ fn verify_expected_result<T: Debug + PartialEq + Sized>(
                 Ok(())
             } else {
                 info!("*** FAILED ***");
-                Err(thrift::Error::User(format!("expected {:?} but got {:?}", &expected, &v).into()),)
+                Err(thrift::Error::User(
+                    format!("expected {:?} but got {:?}", &expected, &v).into(),
+                ))
             }
         }
         Err(e) => Err(e),
diff --git a/test/rs/src/bin/test_server.rs b/test/rs/src/bin/test_server.rs
index c1f3175..6a05e79 100644
--- a/test/rs/src/bin/test_server.rs
+++ b/test/rs/src/bin/test_server.rs
@@ -15,23 +15,25 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use clap::{clap_app, value_t};
 use env_logger;
 use log::*;
-use clap::{clap_app, value_t};
 
 use std::collections::{BTreeMap, BTreeSet};
 use std::thread;
 use std::time::Duration;
 
 use thrift;
-use thrift::OrderedFloat;
-use thrift::protocol::{TBinaryInputProtocolFactory, TBinaryOutputProtocolFactory,
-                       TCompactInputProtocolFactory, TCompactOutputProtocolFactory,
-                       TInputProtocolFactory, TOutputProtocolFactory};
+use thrift::protocol::{
+    TBinaryInputProtocolFactory, TBinaryOutputProtocolFactory, TCompactInputProtocolFactory,
+    TCompactOutputProtocolFactory, TInputProtocolFactory, TOutputProtocolFactory,
+};
 use thrift::server::{TMultiplexedProcessor, TServer};
-use thrift::transport::{TBufferedReadTransportFactory, TBufferedWriteTransportFactory,
-                        TFramedReadTransportFactory, TFramedWriteTransportFactory,
-                        TReadTransportFactory, TWriteTransportFactory};
+use thrift::transport::{
+    TBufferedReadTransportFactory, TBufferedWriteTransportFactory, TFramedReadTransportFactory,
+    TFramedWriteTransportFactory, TReadTransportFactory, TWriteTransportFactory,
+};
+use thrift::OrderedFloat;
 use thrift_test::*;
 
 fn main() {
@@ -49,7 +51,6 @@ fn main() {
 }
 
 fn run() -> thrift::Result<()> {
-
     // unsupported options:
     // --domain-socket
     // --pipe
@@ -75,50 +76,55 @@ fn run() -> thrift::Result<()> {
 
     info!("binding to {}", listen_address);
 
-    let (i_transport_factory, o_transport_factory): (Box<dyn TReadTransportFactory>,
-                                                     Box<dyn TWriteTransportFactory>) =
-        match &*transport {
-            "buffered" => {
-                (Box::new(TBufferedReadTransportFactory::new()),
-                 Box::new(TBufferedWriteTransportFactory::new()))
-            }
-            "framed" => {
-                (Box::new(TFramedReadTransportFactory::new()),
-                 Box::new(TFramedWriteTransportFactory::new()))
-            }
-            unknown => {
-                return Err(format!("unsupported transport type {}", unknown).into());
-            }
-        };
-
-    let (i_protocol_factory, o_protocol_factory): (Box<dyn TInputProtocolFactory>,
-                                                   Box<dyn TOutputProtocolFactory>) =
-        match &*protocol {
-            "binary" | "multi" | "multi:binary" => {
-                (Box::new(TBinaryInputProtocolFactory::new()),
-                 Box::new(TBinaryOutputProtocolFactory::new()))
-            }
-            "compact" | "multic" | "multi:compact" => {
-                (Box::new(TCompactInputProtocolFactory::new()),
-                 Box::new(TCompactOutputProtocolFactory::new()))
-            }
-            unknown => {
-                return Err(format!("unsupported transport type {}", unknown).into());
-            }
-        };
+    let (i_transport_factory, o_transport_factory): (
+        Box<dyn TReadTransportFactory>,
+        Box<dyn TWriteTransportFactory>,
+    ) = match &*transport {
+        "buffered" => (
+            Box::new(TBufferedReadTransportFactory::new()),
+            Box::new(TBufferedWriteTransportFactory::new()),
+        ),
+        "framed" => (
+            Box::new(TFramedReadTransportFactory::new()),
+            Box::new(TFramedWriteTransportFactory::new()),
+        ),
+        unknown => {
+            return Err(format!("unsupported transport type {}", unknown).into());
+        }
+    };
+
+    let (i_protocol_factory, o_protocol_factory): (
+        Box<dyn TInputProtocolFactory>,
+        Box<dyn TOutputProtocolFactory>,
+    ) = match &*protocol {
+        "binary" | "multi" | "multi:binary" => (
+            Box::new(TBinaryInputProtocolFactory::new()),
+            Box::new(TBinaryOutputProtocolFactory::new()),
+        ),
+        "compact" | "multic" | "multi:compact" => (
+            Box::new(TCompactInputProtocolFactory::new()),
+            Box::new(TCompactOutputProtocolFactory::new()),
+        ),
+        unknown => {
+            return Err(format!("unsupported transport type {}", unknown).into());
+        }
+    };
 
     let test_processor = ThriftTestSyncProcessor::new(ThriftTestSyncHandlerImpl {});
 
     match &*server_type {
         "simple" | "thread-pool" => {
             if protocol == "multi" || protocol == "multic" {
-                let second_service_processor = SecondServiceSyncProcessor::new(SecondServiceSyncHandlerImpl {},);
+                let second_service_processor =
+                    SecondServiceSyncProcessor::new(SecondServiceSyncHandlerImpl {});
 
                 let mut multiplexed_processor = TMultiplexedProcessor::new();
-                multiplexed_processor
-                    .register("ThriftTest", Box::new(test_processor), true)?;
-                multiplexed_processor
-                    .register("SecondService", Box::new(second_service_processor), false)?;
+                multiplexed_processor.register("ThriftTest", Box::new(test_processor), true)?;
+                multiplexed_processor.register(
+                    "SecondService",
+                    Box::new(second_service_processor),
+                    false,
+                )?;
 
                 let mut server = TServer::new(
                     i_transport_factory,
@@ -315,15 +321,11 @@ impl ThriftTestSyncHandler for ThriftTestSyncHandlerImpl {
         info!("testException({})", arg);
 
         match &*arg {
-            "Xception" => {
-                Err(
-                    (Xception {
-                             error_code: Some(1001),
-                             message: Some(arg),
-                         })
-                        .into(),
-                )
-            }
+            "Xception" => Err((Xception {
+                error_code: Some(1001),
+                message: Some(arg),
+            })
+            .into()),
             "TException" => Err("this is a random error".into()),
             _ => Ok(()),
         }
@@ -339,41 +341,27 @@ impl ThriftTestSyncHandler for ThriftTestSyncHandlerImpl {
     //   do not throw anything and return Xtruct with string_thing = arg1
     fn handle_test_multi_exception(&self, arg0: String, arg1: String) -> thrift::Result<Xtruct> {
         match &*arg0 {
-            "Xception" => {
-                Err(
-                    (Xception {
-                             error_code: Some(1001),
-                             message: Some("This is an Xception".to_owned()),
-                         })
-                        .into(),
-                )
-            }
-            "Xception2" => {
-                Err(
-                    (Xception2 {
-                             error_code: Some(2002),
-                             struct_thing: Some(
-                            Xtruct {
-                                string_thing: Some("This is an Xception2".to_owned()),
-                                byte_thing: None,
-                                i32_thing: None,
-                                i64_thing: None,
-                            },
-                        ),
-                         })
-                        .into(),
-                )
-            }
-            _ => {
-                Ok(
-                    Xtruct {
-                        string_thing: Some(arg1),
-                        byte_thing: None,
-                        i32_thing: None,
-                        i64_thing: None,
-                    },
-                )
-            }
+            "Xception" => Err((Xception {
+                error_code: Some(1001),
+                message: Some("This is an Xception".to_owned()),
+            })
+            .into()),
+            "Xception2" => Err((Xception2 {
+                error_code: Some(2002),
+                struct_thing: Some(Xtruct {
+                    string_thing: Some("This is an Xception2".to_owned()),
+                    byte_thing: None,
+                    i32_thing: None,
+                    i64_thing: None,
+                }),
+            })
+            .into()),
+            _ => Ok(Xtruct {
+                string_thing: Some(arg1),
+                byte_thing: None,
+                i32_thing: None,
+                i64_thing: None,
+            }),
         }
     }
 
diff --git a/tutorial/rs/Makefile.am b/tutorial/rs/Makefile.am
index 666331e..4aa05da 100644
--- a/tutorial/rs/Makefile.am
+++ b/tutorial/rs/Makefile.am
@@ -24,6 +24,7 @@ gen-rs/tutorial.rs gen-rs/shared.rs: $(top_srcdir)/tutorial/tutorial.thrift
 
 all-local: gen-rs/tutorial.rs
 	$(CARGO) build
+	$(CARGO) fmt --all -- --check
 	[ -d bin ] || mkdir bin
 	cp target/debug/tutorial_server bin/tutorial_server
 	cp target/debug/tutorial_client bin/tutorial_client
diff --git a/tutorial/rs/src/bin/tutorial_server.rs b/tutorial/rs/src/bin/tutorial_server.rs
index b6ed7a1..ad16ab6 100644
--- a/tutorial/rs/src/bin/tutorial_server.rs
+++ b/tutorial/rs/src/bin/tutorial_server.rs
@@ -144,7 +144,7 @@ impl CalculatorSyncHandler for CalculatorServer {
                         } else {
                             Ok(num1 / num2)
                         }
-                    },
+                    }
                     _ => {
                         let op_val: i32 = op.into();
                         Err(InvalidOperation {