rust to add uuid support
diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
index f454d9b..2742724 100644
--- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
@@ -17,11 +17,11 @@
  * under the License.
  */
 
-#include <string>
 #include <iostream>
+#include <string>
 
-#include "thrift/platform.h"
 #include "thrift/generate/t_generator.h"
+#include "thrift/platform.h"
 
 using std::map;
 using std::ofstream;
@@ -34,25 +34,17 @@
 static const string endl("\n"); // avoid ostream << std::endl flushes
 static const string SERVICE_RESULT_VARIABLE("result_value");
 static const string RESULT_STRUCT_SUFFIX("Result");
-static const string RUST_RESERVED_WORDS[] = {
-  "abstract", "alignof", "as", "become",
-  "box", "break", "const", "continue",
-  "crate", "do", "else", "enum",
-  "extern", "false", "final", "fn",
-  "for", "if", "impl", "in",
-  "let", "loop", "macro", "match",
-  "mod", "move", "mut", "offsetof",
-  "override", "priv", "proc", "pub",
-  "pure", "ref", "return", "Self",
-  "self", "sizeof", "static", "struct",
-  "super", "trait", "true", "type",
-  "typeof", "unsafe", "unsized", "use",
-  "virtual", "where", "while", "yield"
-};
-const set<string> RUST_RESERVED_WORDS_SET(
-  RUST_RESERVED_WORDS,
-  RUST_RESERVED_WORDS + sizeof(RUST_RESERVED_WORDS)/sizeof(RUST_RESERVED_WORDS[0])
-);
+static const string RUST_RESERVED_WORDS[]
+    = {"abstract", "alignof",  "as",     "become",  "box",   "break", "const", "continue", "crate",
+       "do",       "else",     "enum",   "extern",  "false", "final", "fn",    "for",      "if",
+       "impl",     "in",       "let",    "loop",    "macro", "match", "mod",   "move",     "mut",
+       "offsetof", "override", "priv",   "proc",    "pub",   "pure",  "ref",   "return",   "Self",
+       "self",     "sizeof",   "static", "struct",  "super", "trait", "true",  "type",     "typeof",
+       "unsafe",   "unsized",  "use",    "virtual", "where", "while", "yield"};
+const set<string> RUST_RESERVED_WORDS_SET(RUST_RESERVED_WORDS,
+                                          RUST_RESERVED_WORDS
+                                              + sizeof(RUST_RESERVED_WORDS)
+                                                    / sizeof(RUST_RESERVED_WORDS[0]));
 
 static const string SYNC_CLIENT_GENERIC_BOUND_VARS("<IP, OP>");
 static const string SYNC_CLIENT_GENERIC_BOUNDS("where IP: TInputProtocol, OP: TOutputProtocol");
@@ -62,11 +54,8 @@
 
 class t_rs_generator : public t_generator {
 public:
-  t_rs_generator(
-    t_program* program,
-    const std::map<std::string, std::string>&,
-    const std::string&
-  ) : t_generator(program) {
+  t_rs_generator(t_program* program, const std::map<std::string, std::string>&, const std::string&)
+    : t_generator(program) {
     gen_dir_ = get_out_dir();
   }
 
@@ -107,7 +96,8 @@
   void render_attributes_and_includes();
 
   // Create the closure of Rust modules referenced by this service.
-  void compute_service_referenced_modules(t_service *tservice, set<pair<string, string>> &referenced_modules);
+  void compute_service_referenced_modules(t_service* tservice,
+                                          set<pair<string, string>>& referenced_modules);
 
   // Write the rust representation of an enum.
   void render_enum_definition(t_enum* tenum, const string& enum_name);
@@ -122,13 +112,16 @@
   // Write a simple rust const value (ie. `pub const FOO: foo...`).
   void render_const_value(const string& name, t_type* ttype, t_const_value* tvalue);
 
-  // Write a constant list, set, map or struct. These constants require allocation and cannot be defined
-  // using a 'pub const'. As a result, I create a holder struct with a single `const_value` method that
-  // returns the initialized instance.
+  // Write a constant list, set, map or struct. These constants require allocation and cannot be
+  // defined using a 'pub const'. As a result, I create a holder struct with a single `const_value`
+  // method that returns the initialized instance.
   void render_const_value_holder(const string& name, t_type* ttype, t_const_value* tvalue);
 
   // Write the actual const value - the right side of a const definition.
-  void render_const_value(t_type* ttype, t_const_value* tvalue, bool is_owned = true, bool is_inline = true);
+  void render_const_value(t_type* ttype,
+                          t_const_value* tvalue,
+                          bool is_owned = true,
+                          bool is_inline = true);
 
   // Write a const struct (returned from `const_value` method).
   void render_const_struct(t_type* ttype, t_const_value* tvalue);
@@ -142,12 +135,14 @@
   // Write a const map (returned from `const_value` method).
   void render_const_map(t_type* ttype, t_const_value* tvalue);
 
-  // Write the rust representation of a thrift struct to the generated file. Set `struct_type` to `T_ARGS`
-  // if rendering the struct used to pack arguments for a service call. When `struct_type` is `T_ARGS` the
-  // struct and its members have module visibility, and all fields are required. When `struct_type` is
-  // anything else the struct and its members have public visibility and fields have the visibility set
-  // in their definition.
-  void render_struct(const string& struct_name, t_struct* tstruct, t_rs_generator::e_struct_type struct_type);
+  // Write the rust representation of a thrift struct to the generated file. Set `struct_type` to
+  // `T_ARGS` if rendering the struct used to pack arguments for a service call. When `struct_type`
+  // is `T_ARGS` the struct and its members have module visibility, and all fields are required.
+  // When `struct_type` is anything else the struct and its members have public visibility and
+  // fields have the visibility set in their definition.
+  void render_struct(const string& struct_name,
+                     t_struct* tstruct,
+                     t_rs_generator::e_struct_type struct_type);
 
   // Write the comment block preceding a type definition (and implementation).
   void render_type_comment(const string& struct_name);
@@ -156,79 +151,77 @@
   // user-defined structs and exception structs. The exact struct type to be generated is controlled
   // by the `struct_type` parameter, which (among other things) modifies the visibility of the
   // written struct and members, controls which trait implementations are generated.
-  void render_struct_definition(
-    const string& struct_name,
-    t_struct* tstruct,
-    t_rs_generator::e_struct_type struct_type
-  );
+  void render_struct_definition(const string& struct_name,
+                                t_struct* tstruct,
+                                t_rs_generator::e_struct_type struct_type);
 
   // Writes the impl block associated with the rust representation of a struct. At minimum this
   // contains the methods to read from a protocol and write to a protocol. Additional methods may
   // be generated depending on `struct_type`.
-  void render_struct_impl(
-    const string& struct_name,
-    t_struct* tstruct,
-    t_rs_generator::e_struct_type struct_type
-  );
+  void render_struct_impl(const string& struct_name,
+                          t_struct* tstruct,
+                          t_rs_generator::e_struct_type struct_type);
 
-  // Generate a `fn new(...)` for a struct with name `struct_name` and type `t_struct`. The auto-generated
-  // code may include generic type parameters to make the constructor more ergonomic. `struct_type` controls
-  // the visibility of the generated constructor.
-  void render_struct_constructor(
-    const string& struct_name,
-    t_struct* tstruct,
-    t_rs_generator::e_struct_type struct_type
-  );
+  // Generate a `fn new(...)` for a struct with name `struct_name` and type `t_struct`. The
+  // auto-generated code may include generic type parameters to make the constructor more ergonomic.
+  // `struct_type` controls the visibility of the generated constructor.
+  void render_struct_constructor(const string& struct_name,
+                                 t_struct* tstruct,
+                                 t_rs_generator::e_struct_type struct_type);
 
-  // Write the `ok_or` method added to all Thrift service call result structs. You can use this method
-  // to convert a struct into a `Result` and use it in a `try!` or combinator chain.
+  // Write the `ok_or` method added to all Thrift service call result structs. You can use this
+  // method to convert a struct into a `Result` and use it in a `try!` or combinator chain.
   void render_result_struct_to_result_method(t_struct* tstruct);
 
   // Write the implementations for the `Error` and `Debug` traits. These traits are necessary for a
   // user-defined exception to be properly handled as Rust errors.
   void render_exception_struct_error_trait_impls(const string& struct_name, t_struct* tstruct);
 
-  // Write the function that serializes a struct to its wire representation. If `struct_type` is `T_ARGS`
-  // then all fields are considered "required", if not, the default optionality is used.
-  void render_struct_sync_write(t_struct *tstruct, t_rs_generator::e_struct_type struct_type);
+  // Write the function that serializes a struct to its wire representation. If `struct_type` is
+  // `T_ARGS` then all fields are considered "required", if not, the default optionality is used.
+  void render_struct_sync_write(t_struct* tstruct, t_rs_generator::e_struct_type struct_type);
 
   // Helper function that serializes a single struct field to its wire representation. Unpacks the
-  // variable (since it may be optional) and serializes according to the optionality rules required by `req`.
-  // Variables in auto-generated code are passed by reference. Since this function may be called in
-  // contexts where the variable is *already* a reference you can set `field_var_is_ref` to `true` to avoid
-  // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
-  void render_struct_field_sync_write(
-    const string &field_var,
-    bool field_var_is_ref,
-    t_field *tfield,
-    t_field::e_req req);
+  // variable (since it may be optional) and serializes according to the optionality rules required
+  // by `req`. Variables in auto-generated code are passed by reference. Since this function may be
+  // called in contexts where the variable is *already* a reference you can set `field_var_is_ref`
+  // to `true` to avoid generating an extra, unnecessary `&` that the compiler will have to
+  // automatically dereference.
+  void render_struct_field_sync_write(const string& field_var,
+                                      bool field_var_is_ref,
+                                      t_field* tfield,
+                                      t_field::e_req req);
 
-  // Write the rust function that serializes a single type (i.e. a i32 etc.) to its wire representation.
-  // Variables in auto-generated code are passed by reference. Since this function may be called in
-  // contexts where the variable is *already* a reference you can set `type_var_is_ref` to `true` to avoid
-  // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
-  void render_type_sync_write(const string &type_var, bool type_var_is_ref, t_type *ttype);
+  // Write the rust function that serializes a single type (i.e. a i32 etc.) to its wire
+  // representation. Variables in auto-generated code are passed by reference. Since this function
+  // may be called in contexts where the variable is *already* a reference you can set
+  // `type_var_is_ref` to `true` to avoid generating an extra, unnecessary `&` that the compiler
+  // will have to automatically dereference.
+  void render_type_sync_write(const string& type_var, bool type_var_is_ref, t_type* ttype);
 
   // Write a list to the output protocol. `list_variable` is the variable containing the list
   // that will be written to the output protocol.
   // Variables in auto-generated code are passed by reference. Since this function may be called in
-  // contexts where the variable is *already* a reference you can set `list_var_is_ref` to `true` to avoid
-  // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
-  void render_list_sync_write(const string &list_var, bool list_var_is_ref, t_list *tlist);
+  // contexts where the variable is *already* a reference you can set `list_var_is_ref` to `true` to
+  // avoid generating an extra, unnecessary `&` that the compiler will have to automatically
+  // dereference.
+  void render_list_sync_write(const string& list_var, bool list_var_is_ref, t_list* tlist);
 
   // Write a set to the output protocol. `set_variable` is the variable containing the set that will
   // be written to the output protocol.
   // Variables in auto-generated code are passed by reference. Since this function may be called in
-  // contexts where the variable is *already* a reference you can set `set_var_is_ref` to `true` to avoid
-  // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
-  void render_set_sync_write(const string &set_var, bool set_var_is_ref, t_set *tset);
+  // contexts where the variable is *already* a reference you can set `set_var_is_ref` to `true` to
+  // avoid generating an extra, unnecessary `&` that the compiler will have to automatically
+  // dereference.
+  void render_set_sync_write(const string& set_var, bool set_var_is_ref, t_set* tset);
 
   // Write a map to the output protocol. `map_variable` is the variable containing the map that will
   // be written to the output protocol.
   // Variables in auto-generated code are passed by reference. Since this function may be called in
-  // contexts where the variable is *already* a reference you can set `map_var_is_ref` to `true` to avoid
-  // generating an extra, unnecessary `&` that the compiler will have to automatically dereference.
-  void render_map_sync_write(const string &map_var, bool map_var_is_ref, t_map *tset);
+  // contexts where the variable is *already* a reference you can set `map_var_is_ref` to `true` to
+  // avoid generating an extra, unnecessary `&` that the compiler will have to automatically
+  // dereference.
+  void render_map_sync_write(const string& map_var, bool map_var_is_ref, t_map* tset);
 
   // Return `true` if we need to dereference ths type when writing an element from a container.
   // Iterations on rust containers are performed as follows: `for v in &values { ... }`
@@ -237,38 +230,41 @@
   bool needs_deref_on_container_write(t_type* ttype);
 
   // Return the variable (including all dereferences) required to write values from a rust container
-  // to the output protocol. For example, if you were iterating through a container and using the temp
-  // variable `v` to represent each element, then `ttype` is the type stored in the container and
-  // `base_var` is "v". The return value is the actual string you will have to use to properly reference
-  // the temp variable for writing to the output protocol.
+  // to the output protocol. For example, if you were iterating through a container and using the
+  // temp variable `v` to represent each element, then `ttype` is the type stored in the container
+  // and `base_var` is "v". The return value is the actual string you will have to use to properly
+  // reference the temp variable for writing to the output protocol.
   string string_container_write_variable(t_type* ttype, const string& base_var);
 
   // Write the code to read bytes from the wire into the given `t_struct`. `struct_name` is the
   // actual Rust name of the `t_struct`. If `struct_type` is `T_ARGS` then all struct fields are
   // necessary. Otherwise, the field's default optionality is used.
-  void render_struct_sync_read(const string &struct_name, t_struct *tstruct, t_rs_generator::e_struct_type struct_type);
+  void render_struct_sync_read(const string& struct_name,
+                               t_struct* tstruct,
+                               t_rs_generator::e_struct_type struct_type);
 
-  // Write the rust function that deserializes a single type (i.e. i32 etc.) from its wire representation.
-  // Set `is_boxed` to `true` if the resulting value should be wrapped in a `Box::new(...)`.
-  void render_type_sync_read(const string &type_var, t_type *ttype, bool is_boxed = false);
+  // Write the rust function that deserializes a single type (i.e. i32 etc.) from its wire
+  // representation. Set `is_boxed` to `true` if the resulting value should be wrapped in a
+  // `Box::new(...)`.
+  void render_type_sync_read(const string& type_var, t_type* ttype, bool is_boxed = false);
 
   // Read the wire representation of a list and convert it to its corresponding rust implementation.
   // The deserialized list is stored in `list_variable`.
-  void render_list_sync_read(t_list *tlist, const string &list_variable);
+  void render_list_sync_read(t_list* tlist, const string& list_variable);
 
   // Read the wire representation of a set and convert it to its corresponding rust implementation.
   // The deserialized set is stored in `set_variable`.
-  void render_set_sync_read(t_set *tset, const string &set_variable);
+  void render_set_sync_read(t_set* tset, const string& set_variable);
 
   // Read the wire representation of a map and convert it to its corresponding rust implementation.
   // The deserialized map is stored in `map_variable`.
-  void render_map_sync_read(t_map *tmap, const string &map_variable);
+  void render_map_sync_read(t_map* tmap, const string& map_variable);
 
   // Return a temporary variable used to store values when deserializing nested containers.
   string struct_field_read_temp_variable(t_field* tfield);
 
-  // Top-level function that calls the various render functions necessary to write the rust representation
-  // of a thrift union (i.e. an enum).
+  // Top-level function that calls the various render functions necessary to write the rust
+  // representation of a thrift union (i.e. an enum).
   void render_union(t_struct* tstruct);
 
   // Write the enum corresponding to the Thrift union.
@@ -278,20 +274,21 @@
   void render_union_impl(const string& union_name, t_struct* tstruct);
 
   // Write the `ENUM::write_to_out_protocol` function.
-  void render_union_sync_write(const string &union_name, t_struct *tstruct);
+  void render_union_sync_write(const string& union_name, t_struct* tstruct);
 
   // Write the `ENUM::read_from_in_protocol` function.
-  void render_union_sync_read(const string &union_name, t_struct *tstruct);
+  void render_union_sync_read(const string& union_name, t_struct* tstruct);
 
-  // Top-level function that calls the various render functions necessary to write the rust representation
-  // of a Thrift client.
+  // Top-level function that calls the various render functions necessary to write the rust
+  // representation of a Thrift client.
   void render_sync_client(t_service* tservice);
 
   // Write the trait with the service-call methods for `tservice`.
-  void render_sync_client_trait(t_service *tservice);
+  void render_sync_client_trait(t_service* tservice);
 
-  // Write the trait to be implemented by the client impl if end users can use it to make service calls.
-  void render_sync_client_marker_trait(t_service *tservice);
+  // Write the trait to be implemented by the client impl if end users can use it to make service
+  // calls.
+  void render_sync_client_marker_trait(t_service* tservice);
 
   // Write the code to create the Thrift service sync client struct and its matching 'impl' block.
   void render_sync_client_definition_and_impl(const string& client_impl_name);
@@ -303,14 +300,14 @@
   // Write the code to create the impl block for the `TThriftClient` trait. Since generated
   // Rust Thrift clients perform all their operations using methods defined in this trait, we
   // have to implement it for the client structs.
-  void render_sync_client_tthriftclient_impl(const string &client_impl_name);
+  void render_sync_client_tthriftclient_impl(const string& client_impl_name);
 
   // Write the marker traits for any service(s) being extended, including the one for the current
   // service itself (i.e. `tservice`)
-  void render_sync_client_marker_trait_impls(t_service *tservice, const string &impl_struct_name);
+  void render_sync_client_marker_trait_impls(t_service* tservice, const string& impl_struct_name);
 
   // Generate a list of all the traits this Thrift client struct extends.
-  string sync_client_marker_traits_for_extension(t_service *tservice);
+  string sync_client_marker_traits_for_extension(t_service* tservice);
 
   // Top-level function that writes the code to make the Thrift service calls.
   void render_sync_client_process_impl(t_service* tservice);
@@ -318,26 +315,28 @@
   // Write the actual function that calls out to the remote service and processes its response.
   void render_sync_send_recv_wrapper(t_function* tfunc);
 
-  // Write the `send` functionality for a Thrift service call represented by a `t_service->t_function`.
+  // Write the `send` functionality for a Thrift service call represented by a
+  // `t_service->t_function`.
   void render_sync_send(t_function* tfunc);
 
-  // Write the `recv` functionality for a Thrift service call represented by a `t_service->t_function`.
-  // This method is only rendered if the function is *not* oneway.
+  // Write the `recv` functionality for a Thrift service call represented by a
+  // `t_service->t_function`. This method is only rendered if the function is *not* oneway.
   void render_sync_recv(t_function* tfunc);
 
-  void render_sync_processor(t_service *tservice);
+  void render_sync_processor(t_service* tservice);
 
-  void render_sync_handler_trait(t_service *tservice);
-  void render_sync_processor_definition_and_impl(t_service *tservice);
-  void render_sync_process_delegation_functions(t_service *tservice);
-  void render_sync_process_function(t_function *tfunc, const string &handler_type);
+  void render_sync_handler_trait(t_service* tservice);
+  void render_sync_processor_definition_and_impl(t_service* tservice);
+  void render_sync_process_delegation_functions(t_service* tservice);
+  void render_sync_process_function(t_function* tfunc, const string& handler_type);
   void render_process_match_statements(t_service* tservice);
-  void render_sync_handler_succeeded(t_function *tfunc);
-  void render_sync_handler_failed(t_function *tfunc);
-  void render_sync_handler_failed_user_exception_branch(t_function *tfunc);
-  void render_sync_handler_failed_application_exception_branch(t_function *tfunc, const string &app_err_var);
-  void render_sync_handler_failed_default_exception_branch(t_function *tfunc);
-  void render_sync_handler_send_exception_response(t_function *tfunc, const string &err_var);
+  void render_sync_handler_succeeded(t_function* tfunc);
+  void render_sync_handler_failed(t_function* tfunc);
+  void render_sync_handler_failed_user_exception_branch(t_function* tfunc);
+  void render_sync_handler_failed_application_exception_branch(t_function* tfunc,
+                                                               const string& app_err_var);
+  void render_sync_handler_failed_default_exception_branch(t_function* tfunc);
+  void render_sync_handler_send_exception_response(t_function* tfunc, const string& err_var);
   void render_service_call_structs(t_service* tservice);
   void render_service_call_args_struct(t_function* tfunc);
   void render_service_call_result_value_struct(t_function* tfunc);
@@ -345,12 +344,10 @@
   string handler_successful_return_struct(t_function* tfunc);
 
   // Writes the result of `render_thrift_error_struct` wrapped in an `Err(thrift::Error(...))`.
-  void render_thrift_error(
-    const string& error_kind,
-    const string& error_struct,
-    const string& sub_error_kind,
-    const string& error_message
-  );
+  void render_thrift_error(const string& error_kind,
+                           const string& error_struct,
+                           const string& sub_error_kind,
+                           const string& error_message);
 
   // Write a thrift::Error variant struct. Error structs take the form:
   // ```
@@ -366,11 +363,9 @@
   //    message: "This is some error message",
   //  }
   // ```
-  void render_thrift_error_struct(
-    const string& error_struct,
-    const string& sub_error_kind,
-    const string& error_message
-  );
+  void render_thrift_error_struct(const string& error_struct,
+                                  const string& sub_error_kind,
+                                  const string& error_message);
 
   // Return a string containing all the unpacked service call args given a service call function
   // `t_function`. Prepends the args with either `&mut self` or `&self` and includes the arg types
@@ -383,8 +378,8 @@
   // `field_prefix`, for example: `self.field_0`.
   string rust_sync_service_call_invocation(t_function* tfunc, const string& field_prefix = "");
 
-  // Return a string containing all fields in the struct `tstruct` for use in a function declaration.
-  // Each field is followed by its type, for example: `field_0: String`.
+  // Return a string containing all fields in the struct `tstruct` for use in a function
+  // declaration. Each field is followed by its type, for example: `field_0: String`.
   string struct_to_declaration(t_struct* tstruct, t_rs_generator::e_struct_type struct_type);
 
   // Return a string containing all fields in the struct `tstruct` for use in a function call,
@@ -413,7 +408,8 @@
   // Return `true` if we can write a const of the form `pub const FOO: ...`.
   bool can_generate_simple_const(t_type* ttype);
 
-  // Return `true` if we cannot write a standard Rust constant (because the type needs some allocation).
+  // Return `true` if we cannot write a standard Rust constant (because the type needs some
+  // allocation).
   bool can_generate_const_holder(t_type* ttype);
 
   // Return `true` if this type is a void, and should be represented by the rust `()` type.
@@ -421,8 +417,9 @@
 
   t_field::e_req actual_field_req(t_field* tfield, t_rs_generator::e_struct_type struct_type);
 
-  // Return `true` if this `t_field::e_req` is either `t_field::T_OPTIONAL` or `t_field::T_OPT_IN_REQ_OUT`
-  // and needs to be wrapped by an `Option<TYPE_NAME>`, `false` otherwise.
+  // Return `true` if this `t_field::e_req` is either `t_field::T_OPTIONAL` or
+  // `t_field::T_OPT_IN_REQ_OUT` and needs to be wrapped by an `Option<TYPE_NAME>`, `false`
+  // otherwise.
   bool is_optional(t_field::e_req req);
 
   // Return `true` if the service call has arguments, `false` otherwise.
@@ -431,30 +428,32 @@
   // Return `true` if a service call has non-`()` arguments, `false` otherwise.
   bool has_non_void_args(t_function* tfunc);
 
-  // Return `pub ` (notice trailing whitespace!) if the struct should be public, `` (empty string) otherwise.
+  // Return `pub ` (notice trailing whitespace!) if the struct should be public, `` (empty string)
+  // otherwise.
   string visibility_qualifier(t_rs_generator::e_struct_type struct_type);
 
-  // Returns the namespace prefix for a given Thrift service. If the type is defined in the presently-computed
-  // Thrift program, then an empty string is returned.
+  // Returns the namespace prefix for a given Thrift service. If the type is defined in the
+  // presently-computed Thrift program, then an empty string is returned.
   string rust_namespace(t_service* tservice);
 
-  // Returns the namespace prefix for a given Thrift type. If the type is defined in the presently-computed
-  // Thrift program, then an empty string is returned.
+  // Returns the namespace prefix for a given Thrift type. If the type is defined in the
+  // presently-computed Thrift program, then an empty string is returned.
   string rust_namespace(t_type* ttype);
 
-  // Returns the camel-cased name for a Rust struct type. Handles the case where `tstruct->get_name()` is
-  // a reserved word.
+  // Returns the camel-cased name for a Rust struct type. Handles the case where
+  // `tstruct->get_name()` is a reserved word.
   string rust_struct_name(t_struct* tstruct);
 
   // Returns the snake-cased name for a Rust field or local variable. Handles the case where
   // `tfield->get_name()` is a reserved word.
   string rust_field_name(t_field* tstruct);
 
-  // Returns the camel-cased name for a Rust union type. Handles the case where `tstruct->get_name()` is
-  // a reserved word.
+  // Returns the camel-cased name for a Rust union type. Handles the case where
+  // `tstruct->get_name()` is a reserved word.
   string rust_union_field_name(t_field* tstruct);
 
-  // Converts any variable name into a 'safe' variant that does not clash with any Rust reserved keywords.
+  // Converts any variable name into a 'safe' variant that does not clash with any Rust reserved
+  // keywords.
   string rust_safe_name(const string& name);
 
   // Return `true` if the name is a reserved Rust keyword, `false` otherwise.
@@ -463,7 +462,8 @@
   // Return the name of the function that users will invoke to make outgoing service calls.
   string service_call_client_function_name(t_function* tfunc);
 
-  // Return the name of the function that users will have to implement to handle incoming service calls.
+  // Return the name of the function that users will have to implement to handle incoming service
+  // calls.
   string service_call_handler_function_name(t_function* tfunc);
 
   // Return the name of the struct used to pack the arguments for the thrift service call.
@@ -481,7 +481,8 @@
   // Return the name for the sync service client struct given a `t_service`.
   string rust_sync_client_impl_name(t_service* tservice);
 
-  // Return the trait name that users will have to implement for the server half of a Thrift service.
+  // Return the trait name that users will have to implement for the server half of a Thrift
+  // service.
   string rust_sync_handler_trait_name(t_service* tservice);
 
   // Return the struct name for the  server half of a Thrift service.
@@ -489,7 +490,7 @@
 
   // Return the struct name for the struct that contains all the service-call implementations for
   // the server half of a Thrift service.
-  string rust_sync_processor_impl_name(t_service *tservice);
+  string rust_sync_processor_impl_name(t_service* tservice);
 
   // Return the variant name for an enum variant
   string rust_enum_variant_name(const string& name);
@@ -537,14 +538,17 @@
   // code might not include imports from crates
   f_gen_ << "#![allow(unused_extern_crates)]" << endl;
   // constructors take *all* struct parameters, which can trigger the "too many arguments" warning
-  // some auto-gen'd types can be deeply nested. clippy recommends factoring them out which is hard to autogen
-  // some methods may start with "is_"
-  // FIXME: re-enable the 'vec_box' lint see: [THRIFT-5364](https://issues.apache.org/jira/browse/THRIFT-5364)
-  // This can happen because we automatically generate a Vec<Box<Type>> when the type is a typedef
-  // and it's a forward typedef. This (typedef + forward typedef) can happen in two situations:
+  // some auto-gen'd types can be deeply nested. clippy recommends factoring them out which is hard
+  // to autogen some methods may start with "is_"
+  // FIXME: re-enable the 'vec_box' lint see:
+  // [THRIFT-5364](https://issues.apache.org/jira/browse/THRIFT-5364) This can happen because we
+  // automatically generate a Vec<Box<Type>> when the type is a typedef and it's a forward typedef.
+  // This (typedef + forward typedef) can happen in two situations:
   // 1. When the type is recursive
   // 2. When you define types out of order
-  f_gen_ << "#![allow(clippy::too_many_arguments, clippy::type_complexity, clippy::vec_box, clippy::wrong_self_convention)]" << endl;
+  f_gen_ << "#![allow(clippy::too_many_arguments, clippy::type_complexity, clippy::vec_box, "
+            "clippy::wrong_self_convention)]"
+         << endl;
   // prevent rustfmt from running against this file
   // lines are too long, code is (thankfully!) not visual-indented, etc.
   // can't use #[rustfmt::skip] see: https://github.com/rust-lang/rust/issues/54726
@@ -562,8 +566,13 @@
   f_gen_ << "use std::rc::Rc;" << endl;
   f_gen_ << endl;
   f_gen_ << "use thrift::OrderedFloat;" << endl;
-  f_gen_ << "use thrift::{ApplicationError, ApplicationErrorKind, ProtocolError, ProtocolErrorKind, TThriftClient};" << endl;
-  f_gen_ << "use thrift::protocol::{TFieldIdentifier, TListIdentifier, TMapIdentifier, TMessageIdentifier, TMessageType, TInputProtocol, TOutputProtocol, TSerializable, TSetIdentifier, TStructIdentifier, TType};" << endl;
+  f_gen_ << "use thrift::{ApplicationError, ApplicationErrorKind, ProtocolError, "
+            "ProtocolErrorKind, TThriftClient};"
+         << endl;
+  f_gen_ << "use thrift::protocol::{TFieldIdentifier, TListIdentifier, TMapIdentifier, "
+            "TMessageIdentifier, TMessageType, TInputProtocol, TOutputProtocol, TSerializable, "
+            "TSetIdentifier, TStructIdentifier, TType};"
+         << endl;
   f_gen_ << "use thrift::protocol::field_id;" << endl;
   f_gen_ << "use thrift::protocol::verify_expected_message_type;" << endl;
   f_gen_ << "use thrift::protocol::verify_expected_sequence_number;" << endl;
@@ -574,18 +583,21 @@
 
   // add all the program includes
   // NOTE: this is more involved than you would expect because of service extension
-  // Basically, I have to find the closure of all the services and include their modules at the top-level
+  // Basically, I have to find the closure of all the services and include their modules at the
+  // top-level
 
   set<pair<string, string>> referenced_modules; // set<module, namespace>
 
   // first, start by adding explicit thrift includes
   const vector<t_program*> includes = get_program()->get_includes();
   vector<t_program*>::const_iterator includes_iter;
-  for(includes_iter = includes.begin(); includes_iter != includes.end(); ++includes_iter) {
-    referenced_modules.insert(std::make_pair((*includes_iter)->get_name(), (*includes_iter)->get_namespace("rs")));
+  for (includes_iter = includes.begin(); includes_iter != includes.end(); ++includes_iter) {
+    referenced_modules.insert(
+        std::make_pair((*includes_iter)->get_name(), (*includes_iter)->get_namespace("rs")));
   }
 
-  // next, recursively iterate through all the services and add the names of any programs they reference
+  // next, recursively iterate through all the services and add the names of any programs they
+  // reference
   const vector<t_service*> services = get_program()->get_services();
   vector<t_service*>::const_iterator service_iter;
   for (service_iter = services.begin(); service_iter != services.end(); ++service_iter) {
@@ -595,7 +607,8 @@
   // finally, write all the "pub use..." declarations
   if (!referenced_modules.empty()) {
     set<pair<string, string>>::iterator module_iter;
-    for (module_iter = referenced_modules.begin(); module_iter != referenced_modules.end(); ++module_iter) {
+    for (module_iter = referenced_modules.begin(); module_iter != referenced_modules.end();
+         ++module_iter) {
       string module_name((*module_iter).first);
 
       string module_namespace((*module_iter).second);
@@ -604,7 +617,8 @@
       if (module_namespace.empty()) {
         f_gen_ << "use crate::" << rust_snake_case(module_name) << ";" << endl;
       } else {
-        f_gen_ << "use crate::" << module_namespace << "::" << rust_snake_case(module_name) << ";" << endl;
+        f_gen_ << "use crate::" << module_namespace << "::" << rust_snake_case(module_name) << ";"
+               << endl;
       }
     }
     f_gen_ << endl;
@@ -612,13 +626,13 @@
 }
 
 void t_rs_generator::compute_service_referenced_modules(
-  t_service *tservice,
-  set<pair<string, string>> &referenced_modules
-) {
+    t_service* tservice,
+    set<pair<string, string>>& referenced_modules) {
   t_service* extends = tservice->get_extends();
   if (extends) {
     if (extends->get_program() != get_program()) {
-      referenced_modules.insert(std::make_pair(extends->get_program()->get_name(), extends->get_program()->get_namespace("rs")));
+      referenced_modules.insert(std::make_pair(extends->get_program()->get_name(),
+                                               extends->get_program()->get_namespace("rs")));
     }
     compute_service_referenced_modules(extends, referenced_modules);
   }
@@ -663,7 +677,9 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_const_value_holder(const string& name, t_type* ttype, t_const_value* tvalue) {
+void t_rs_generator::render_const_value_holder(const string& name,
+                                               t_type* ttype,
+                                               t_const_value* tvalue) {
   if (!can_generate_const_holder(ttype)) {
     throw "cannot generate constant holder for " + ttype->get_name();
   }
@@ -685,7 +701,10 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_const_value(t_type* ttype, t_const_value* tvalue, bool is_owned, bool is_inline) {
+void t_rs_generator::render_const_value(t_type* ttype,
+                                        t_const_value* tvalue,
+                                        bool is_owned,
+                                        bool is_inline) {
   if (!is_inline) {
     f_gen_ << indent();
   }
@@ -696,7 +715,8 @@
     case t_base_type::TYPE_STRING:
       if (tbase_type->is_binary()) {
         if (is_owned) {
-          f_gen_ << "\"" << tvalue->get_string() << "\""<<  ".to_owned().into_bytes()";
+          f_gen_ << "\"" << tvalue->get_string() << "\""
+                 << ".to_owned().into_bytes()";
         } else {
           f_gen_ << "b\"" << tvalue->get_string() << "\"";
         }
@@ -707,6 +727,9 @@
         }
       }
       break;
+    case t_base_type::TYPE_UUID:
+      f_gen_ << "Uuid::parse_str(\"" << tvalue->get_string() << "\").unwrap()";
+      break;
     case t_base_type::TYPE_BOOL:
       f_gen_ << (tvalue->get_integer() ? "true" : "false");
       break;
@@ -727,13 +750,8 @@
   } else if (ttype->is_enum()) {
     f_gen_ << "{" << endl;
     indent_up();
-    f_gen_
-      << indent()
-      << to_rust_type(ttype)
-      << "::try_from("
-      << tvalue->get_integer()
-      << ").expect(\"expecting valid const value\")"
-      << endl;
+    f_gen_ << indent() << to_rust_type(ttype) << "::try_from(" << tvalue->get_integer()
+           << ").expect(\"expecting valid const value\")" << endl;
     indent_down();
     f_gen_ << indent() << "}";
   } else if (ttype->is_struct() || ttype->is_xception()) {
@@ -780,7 +798,7 @@
   indent_up();
   const vector<t_const_value*>& elems = tvalue->get_list();
   vector<t_const_value*>::const_iterator elem_iter;
-  for(elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
+  for (elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
     f_gen_ << indent();
     t_const_value* elem_value = (*elem_iter);
     render_const_value(elem_type, elem_value);
@@ -796,7 +814,7 @@
   indent_up();
   const vector<t_const_value*>& elems = tvalue->get_list();
   vector<t_const_value*>::const_iterator elem_iter;
-  for(elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
+  for (elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
     f_gen_ << indent();
     t_const_value* elem_value = (*elem_iter);
     render_const_value(elem_type, elem_value);
@@ -811,7 +829,8 @@
   t_type* val_type = ((t_map*)ttype)->get_val_type();
   f_gen_ << "BTreeMap::from([" << endl;
   indent_up();
-  const map<t_const_value*, t_const_value*, t_const_value::value_compare>& elems = tvalue->get_map();
+  const map<t_const_value*, t_const_value*, t_const_value::value_compare>& elems
+      = tvalue->get_map();
   map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator elem_iter;
   for (elem_iter = elems.begin(); elem_iter != elems.end(); ++elem_iter) {
     t_const_value* key_value = elem_iter->first;
@@ -840,7 +859,8 @@
 
 void t_rs_generator::generate_typedef(t_typedef* ttypedef) {
   std::string actual_type = to_rust_type(ttypedef->get_type());
-  f_gen_ << "pub type " << rust_safe_name(ttypedef->get_symbolic()) << " = " << actual_type << ";" << endl;
+  f_gen_ << "pub type " << rust_safe_name(ttypedef->get_symbolic()) << " = " << actual_type << ";"
+         << endl;
   f_gen_ << endl;
 }
 
@@ -858,7 +878,7 @@
 }
 
 void t_rs_generator::render_enum_definition(t_enum* tenum, const string& enum_name) {
-  render_rustdoc((t_doc*) tenum);
+  render_rustdoc((t_doc*)tenum);
   f_gen_ << "#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
   f_gen_ << "pub struct " << enum_name << "(pub i32);" << endl;
   f_gen_ << endl;
@@ -872,18 +892,14 @@
 
   // associated constants for each IDL-defined enum variant
   {
-      vector<t_enum_value*>::iterator constants_iter;
-      for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
-        t_enum_value* val = (*constants_iter);
-        render_rustdoc((t_doc*) val);
-        f_gen_
-            << indent()
-            << "pub const " << rust_enum_variant_name(val->get_name()) << ": " << enum_name
-            << " = "
-            << enum_name << "(" << val->get_value() << ")"
-            << ";"
-            << endl;
-      }
+    vector<t_enum_value*>::iterator constants_iter;
+    for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
+      t_enum_value* val = (*constants_iter);
+      render_rustdoc((t_doc*)val);
+      f_gen_ << indent() << "pub const " << rust_enum_variant_name(val->get_name()) << ": "
+             << enum_name << " = " << enum_name << "(" << val->get_value() << ")"
+             << ";" << endl;
+    }
   }
 
   // array containing all IDL-defined enum variants
@@ -893,11 +909,7 @@
     vector<t_enum_value*>::iterator constants_iter;
     for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
       t_enum_value* val = (*constants_iter);
-      f_gen_
-          << indent()
-          << "Self::" << rust_enum_variant_name(val->get_name())
-          << ","
-          << endl;
+      f_gen_ << indent() << "Self::" << rust_enum_variant_name(val->get_name()) << "," << endl;
     }
     indent_down();
     f_gen_ << indent() << "];" << endl;
@@ -912,21 +924,21 @@
 
   f_gen_ << indent() << "#[allow(clippy::trivially_copy_pass_by_ref)]" << endl;
   f_gen_
-    << indent()
-    << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-    << endl;
+      << indent()
+      << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
+      << endl;
   indent_up();
   f_gen_ << indent() << "o_prot.write_i32(self.0)" << endl;
   indent_down();
   f_gen_ << indent() << "}" << endl;
 
-  f_gen_
-    << indent()
-    << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" << enum_name << "> {"
-    << endl;
+  f_gen_ << indent()
+         << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
+         << enum_name << "> {" << endl;
   indent_up();
   f_gen_ << indent() << "let enum_value = i_prot.read_i32()?;" << endl;
-  f_gen_ << indent() << "Ok(" << enum_name << "::from(enum_value)" << ")" << endl;
+  f_gen_ << indent() << "Ok(" << enum_name << "::from(enum_value)"
+         << ")" << endl;
   indent_down();
   f_gen_ << indent() << "}" << endl;
 
@@ -947,11 +959,8 @@
   vector<t_enum_value*>::iterator constants_iter;
   for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
     t_enum_value* val = (*constants_iter);
-    f_gen_
-      << indent()
-      << val->get_value()
-      << " => " << enum_name << "::" << rust_enum_variant_name(val->get_name()) << ","
-      << endl;
+    f_gen_ << indent() << val->get_value() << " => " << enum_name
+           << "::" << rust_enum_variant_name(val->get_name()) << "," << endl;
   }
   f_gen_ << indent() << "_ => " << enum_name << "(i)" << endl;
   indent_down();
@@ -1019,11 +1028,9 @@
   }
 }
 
-void t_rs_generator::render_struct(
-  const string& struct_name,
-  t_struct* tstruct,
-  t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct(const string& struct_name,
+                                   t_struct* tstruct,
+                                   t_rs_generator::e_struct_type struct_type) {
   render_type_comment(struct_name);
   render_struct_definition(struct_name, tstruct, struct_type);
   render_struct_impl(struct_name, tstruct, struct_type);
@@ -1032,46 +1039,40 @@
   }
 }
 
-void t_rs_generator::render_struct_definition(
-  const string& struct_name,
-  t_struct* tstruct,
-  t_rs_generator::e_struct_type struct_type
-) {
-  render_rustdoc((t_doc*) tstruct);
+void t_rs_generator::render_struct_definition(const string& struct_name,
+                                              t_struct* tstruct,
+                                              t_rs_generator::e_struct_type struct_type) {
+  render_rustdoc((t_doc*)tstruct);
 
   const vector<t_field*> members = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator members_iter;
-  bool need_default = struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION;
-  for (members_iter = members.begin(); need_default && members_iter != members.end(); ++members_iter) {
+  bool need_default
+      = struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION;
+  for (members_iter = members.begin(); need_default && members_iter != members.end();
+       ++members_iter) {
     t_field* member = *members_iter;
     if (!is_optional(member->get_req())) {
       need_default = false;
     }
   }
-  f_gen_
-    << "#[derive(Clone, Debug"
-    << (need_default ? ", Default" : "")
-    << ", Eq, Hash, Ord, PartialEq, PartialOrd)]"
-    << endl;
+  f_gen_ << "#[derive(Clone, Debug" << (need_default ? ", Default" : "")
+         << ", Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
   f_gen_ << visibility_qualifier(struct_type) << "struct " << struct_name << " {" << endl;
 
   // render the members
   if (!members.empty()) {
     indent_up();
 
-    for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+    for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
       t_field* member = (*members_iter);
       t_field::e_req member_req = actual_field_req(member, struct_type);
 
       string rust_type = to_rust_type(member->get_type());
       rust_type = is_optional(member_req) ? "Option<" + rust_type + ">" : rust_type;
 
-      render_rustdoc((t_doc*) member);
-      f_gen_
-        << indent()
-        << visibility_qualifier(struct_type)
-        << rust_field_name(member) << ": " << rust_type << ","
-        << endl;
+      render_rustdoc((t_doc*)member);
+      f_gen_ << indent() << visibility_qualifier(struct_type) << rust_field_name(member) << ": "
+             << rust_type << "," << endl;
     }
 
     indent_down();
@@ -1081,7 +1082,8 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_exception_struct_error_trait_impls(const string& struct_name, t_struct* tstruct) {
+void t_rs_generator::render_exception_struct_error_trait_impls(const string& struct_name,
+                                                               t_struct* tstruct) {
   // error::Error trait
   f_gen_ << "impl Error for " << struct_name << " {}" << endl;
   f_gen_ << endl;
@@ -1103,12 +1105,9 @@
   indent_up();
   f_gen_ << indent() << "fn fmt(&self, f: &mut Formatter) -> fmt::Result {" << endl;
   indent_up();
-  f_gen_
-      << indent()
-      << "write!(f, "
-      << "\"remote service threw " << tstruct->get_name() << "\"" // use *original* name
-      << ")"
-      << endl;
+  f_gen_ << indent() << "write!(f, "
+         << "\"remote service threw " << tstruct->get_name() << "\"" // use *original* name
+         << ")" << endl;
   indent_down();
   f_gen_ << indent() << "}" << endl;
   indent_down();
@@ -1116,11 +1115,9 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_struct_impl(
-  const string& struct_name,
-  t_struct* tstruct,
-  t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct_impl(const string& struct_name,
+                                        t_struct* tstruct,
+                                        t_rs_generator::e_struct_type struct_type) {
   f_gen_ << "impl " << struct_name << " {" << endl;
   indent_up();
 
@@ -1149,21 +1146,19 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_struct_constructor(
-  const string& struct_name,
-  t_struct* tstruct,
-  t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct_constructor(const string& struct_name,
+                                               t_struct* tstruct,
+                                               t_rs_generator::e_struct_type struct_type) {
   const vector<t_field*>& members = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator members_iter;
 
-  // build the convenience type parameters that allows us to pass unwrapped values to a constructor and
-  // have them automatically converted into Option<value>
+  // build the convenience type parameters that allows us to pass unwrapped values to a constructor
+  // and have them automatically converted into Option<value>
   bool first_arg = true;
 
   ostringstream generic_type_parameters;
   ostringstream generic_type_qualifiers;
-  for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+  for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
     t_field* member = (*members_iter);
     t_field::e_req member_req = actual_field_req(member, struct_type);
 
@@ -1175,7 +1170,8 @@
         generic_type_qualifiers << ", ";
       }
       generic_type_parameters << "F" << rust_safe_field_id(member->get_key());
-      generic_type_qualifiers << "F" << rust_safe_field_id(member->get_key()) << ": Into<Option<" << to_rust_type(member->get_type()) << ">>";
+      generic_type_qualifiers << "F" << rust_safe_field_id(member->get_key()) << ": Into<Option<"
+                              << to_rust_type(member->get_type()) << ">>";
     }
   }
 
@@ -1190,11 +1186,11 @@
   }
 
   // now build the actual constructor arg list
-  // when we're building this list we have to use the type parameters in place of the actual type names
-  // if necessary
+  // when we're building this list we have to use the type parameters in place of the actual type
+  // names if necessary
   ostringstream args;
   first_arg = true;
-  for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+  for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
     t_field* member = (*members_iter);
     t_field::e_req member_req = actual_field_req(member, struct_type);
     string member_name(rust_field_name(member));
@@ -1206,7 +1202,8 @@
     }
 
     if (is_optional(member_req)) {
-      args << member_name << ": " << "F" << rust_safe_field_id(member->get_key());
+      args << member_name << ": "
+           << "F" << rust_safe_field_id(member->get_key());
     } else {
       args << member_name << ": " << to_rust_type(member->get_type());
     }
@@ -1215,19 +1212,8 @@
   string arg_string = args.str();
 
   string visibility(visibility_qualifier(struct_type));
-  f_gen_
-    << indent()
-    << visibility
-    << "fn new"
-    << type_parameter_string
-    << "("
-    << arg_string
-    << ") -> "
-    << struct_name
-    << " "
-    << type_qualifier_string
-    << "{"
-    << endl;
+  f_gen_ << indent() << visibility << "fn new" << type_parameter_string << "(" << arg_string
+         << ") -> " << struct_name << " " << type_qualifier_string << "{" << endl;
   indent_up();
 
   if (members.empty()) {
@@ -1236,7 +1222,7 @@
     f_gen_ << indent() << struct_name << " {" << endl;
     indent_up();
 
-    for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+    for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
       t_field* member = (*members_iter);
       t_field::e_req member_req = actual_field_req(member, struct_type);
       string member_name(rust_field_name(member));
@@ -1265,7 +1251,7 @@
   if (index == std::string::npos) {
     throw "result struct " + service_call_name + " missing result suffix";
   } else {
-     service_call_name.replace(index, 6, "");
+    service_call_name.replace(index, 6, "");
   }
 
   const vector<t_field*>& members = tstruct->get_sorted_members();
@@ -1273,7 +1259,7 @@
 
   // find out what the call's expected return type was
   string rust_return_type = "()";
-  for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+  for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
     t_field* member = (*members_iter);
     if (member->get_name() == SERVICE_RESULT_VARIABLE) { // don't have to check safe name here
       rust_return_type = to_rust_type(member->get_type());
@@ -1292,7 +1278,7 @@
   int rendered_branch_count = 0;
 
   // render the exception branches
-  for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+  for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
     t_field* tfield = (*members_iter);
     if (tfield->get_name() != SERVICE_RESULT_VARIABLE) { // don't have to check safe name here
       string field_name("self." + rust_field_name(tfield));
@@ -1300,7 +1286,8 @@
 
       f_gen_ << indent() << branch_statement << " " << field_name << ".is_some() {" << endl;
       indent_up();
-      f_gen_ << indent() << "Err(thrift::Error::User(Box::new(" << field_name << ".unwrap())))" << endl;
+      f_gen_ << indent() << "Err(thrift::Error::User(Box::new(" << field_name << ".unwrap())))"
+             << endl;
       indent_down();
 
       rendered_branch_count++;
@@ -1324,7 +1311,8 @@
     }
   } else {
     string branch_statement = rendered_branch_count == 0 ? "if" : "} else if";
-    f_gen_ << indent() << branch_statement << " self." << SERVICE_RESULT_VARIABLE << ".is_some() {" << endl;
+    f_gen_ << indent() << branch_statement << " self." << SERVICE_RESULT_VARIABLE << ".is_some() {"
+           << endl;
     indent_up();
     f_gen_ << indent() << "Ok(self." << SERVICE_RESULT_VARIABLE << ".unwrap())" << endl;
     indent_down();
@@ -1332,12 +1320,8 @@
     indent_up();
     // if we haven't found a valid return value *or* a user exception
     // then we're in trouble; return a default error
-    render_thrift_error(
-      "Application",
-      "ApplicationError",
-      "ApplicationErrorKind::MissingResult",
-      "\"no result received for " + service_call_name + "\""
-    );
+    render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::MissingResult",
+                        "\"no result received for " + service_call_name + "\"");
     indent_down();
     f_gen_ << indent() << "}" << endl;
   }
@@ -1364,13 +1348,10 @@
   indent_up();
 
   vector<t_field*>::const_iterator member_iter;
-  for(member_iter = members.begin(); member_iter != members.end(); ++member_iter) {
+  for (member_iter = members.begin(); member_iter != members.end(); ++member_iter) {
     t_field* tfield = (*member_iter);
-    f_gen_
-      << indent()
-      << rust_union_field_name(tfield)
-      << "(" << to_rust_type(tfield->get_type()) << "),"
-      << endl;
+    f_gen_ << indent() << rust_union_field_name(tfield) << "(" << to_rust_type(tfield->get_type())
+           << ")," << endl;
   }
 
   indent_down();
@@ -1396,26 +1377,25 @@
 //
 //-----------------------------------------------------------------------------
 
-void t_rs_generator::render_struct_sync_write(
-    t_struct *tstruct,
-    t_rs_generator::e_struct_type struct_type
-) {
+void t_rs_generator::render_struct_sync_write(t_struct* tstruct,
+                                              t_rs_generator::e_struct_type struct_type) {
   f_gen_
-    << indent()
-    << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-    << endl;
+      << indent()
+      << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
+      << endl;
   indent_up();
 
   // write struct header to output protocol
   // note: use the *original* struct name here
-  f_gen_ << indent() << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
+  f_gen_ << indent()
+         << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
   f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl;
 
   // write struct members to output protocol
   vector<t_field*> members = tstruct->get_sorted_members();
   if (!members.empty()) {
     vector<t_field*>::iterator members_iter;
-    for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+    for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
       t_field* member = (*members_iter);
       t_field::e_req member_req = actual_field_req(member, struct_type);
       string member_var("self." + rust_field_name(member));
@@ -1431,16 +1411,17 @@
   f_gen_ << indent() << "}" << endl;
 }
 
-void t_rs_generator::render_union_sync_write(const string &union_name, t_struct *tstruct) {
+void t_rs_generator::render_union_sync_write(const string& union_name, t_struct* tstruct) {
   f_gen_
-    << indent()
-    << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-    << endl;
+      << indent()
+      << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
+      << endl;
   indent_up();
 
   // write struct header to output protocol
   // note: use the *original* struct name here
-  f_gen_ << indent() << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
+  f_gen_ << indent()
+         << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
   f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl;
 
   // write the enum field to the output protocol
@@ -1449,7 +1430,7 @@
     f_gen_ << indent() << "match *self {" << endl;
     indent_up();
     vector<t_field*>::iterator members_iter;
-    for(members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
+    for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
       t_field* member = (*members_iter);
       t_field::e_req member_req = t_field::T_REQUIRED;
       t_type* ttype = member->get_type();
@@ -1458,11 +1439,8 @@
         ttype = ((t_typedef*)ttype)->get_type();
       }
       string match_var((ttype->is_base_type() && !ttype->is_string()) ? "f" : "ref f");
-      f_gen_
-        << indent()
-        << union_name << "::" << rust_union_field_name(member)
-        << "(" << match_var << ") => {"
-        << endl;
+      f_gen_ << indent() << union_name << "::" << rust_union_field_name(member) << "(" << match_var
+             << ") => {" << endl;
       indent_up();
       render_struct_field_sync_write("f", true, member, member_req);
       indent_down();
@@ -1480,25 +1458,23 @@
   f_gen_ << indent() << "}" << endl;
 }
 
-void t_rs_generator::render_struct_field_sync_write(
-  const string &field_var,
-  bool field_var_is_ref,
-  t_field *tfield,
-  t_field::e_req req
-) {
+void t_rs_generator::render_struct_field_sync_write(const string& field_var,
+                                                    bool field_var_is_ref,
+                                                    t_field* tfield,
+                                                    t_field::e_req req) {
   t_type* field_type = tfield->get_type();
   t_type* actual_type = get_true_type(field_type);
 
   ostringstream field_stream;
-  field_stream
-    << "TFieldIdentifier::new("
-    << "\"" << tfield->get_name() << "\"" << ", " // note: use *original* name
-    << to_rust_field_type_enum(field_type) << ", "
-    << tfield->get_key() << ")";
+  field_stream << "TFieldIdentifier::new("
+               << "\"" << tfield->get_name() << "\""
+               << ", " // note: use *original* name
+               << to_rust_field_type_enum(field_type) << ", " << tfield->get_key() << ")";
   string field_ident_string = field_stream.str();
 
   if (is_optional(req)) {
-    string let_var((actual_type->is_base_type() && !actual_type->is_string()) ? "fld_var" : "ref fld_var");
+    string let_var((actual_type->is_base_type() && !actual_type->is_string()) ? "fld_var"
+                                                                              : "ref fld_var");
     f_gen_ << indent() << "if let Some(" << let_var << ") = " << field_var << " {" << endl;
     indent_up();
     f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << endl;
@@ -1519,7 +1495,9 @@
   }
 }
 
-void t_rs_generator::render_type_sync_write(const string &type_var, bool type_var_is_ref, t_type *ttype) {
+void t_rs_generator::render_type_sync_write(const string& type_var,
+                                            bool type_var_is_ref,
+                                            t_type* ttype) {
   if (ttype->is_base_type()) {
     t_base_type* tbase_type = (t_base_type*)ttype;
     switch (tbase_type->get_base()) {
@@ -1534,6 +1512,9 @@
       }
       return;
     }
+    case t_base_type::TYPE_UUID:
+      f_gen_ << indent() << "o_prot.write_uuid(&" + type_var + ")?;" << endl;
+      return;
     case t_base_type::TYPE_BOOL:
       f_gen_ << indent() << "o_prot.write_bool(" + type_var + ")?;" << endl;
       return;
@@ -1556,37 +1537,36 @@
       throw "compiler error: unhandled type";
     }
   } else if (ttype->is_typedef()) {
-    t_typedef* ttypedef = (t_typedef*) ttype;
+    t_typedef* ttypedef = (t_typedef*)ttype;
     render_type_sync_write(type_var, type_var_is_ref, ttypedef->get_type());
     return;
   } else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) {
     f_gen_ << indent() << type_var + ".write_to_out_protocol(o_prot)?;" << endl;
     return;
   } else if (ttype->is_map()) {
-    render_map_sync_write(type_var, type_var_is_ref, (t_map *) ttype);
+    render_map_sync_write(type_var, type_var_is_ref, (t_map*)ttype);
     return;
   } else if (ttype->is_set()) {
-    render_set_sync_write(type_var, type_var_is_ref, (t_set *) ttype);
+    render_set_sync_write(type_var, type_var_is_ref, (t_set*)ttype);
     return;
   } else if (ttype->is_list()) {
-    render_list_sync_write(type_var, type_var_is_ref, (t_list *) ttype);
+    render_list_sync_write(type_var, type_var_is_ref, (t_list*)ttype);
     return;
   }
 
   throw "cannot write unsupported type " + ttype->get_name();
 }
 
-void t_rs_generator::render_list_sync_write(const string &list_var, bool list_var_is_ref, t_list *tlist) {
+void t_rs_generator::render_list_sync_write(const string& list_var,
+                                            bool list_var_is_ref,
+                                            t_list* tlist) {
   t_type* elem_type = tlist->get_elem_type();
 
-  f_gen_
-    << indent()
-    << "o_prot.write_list_begin("
-    << "&TListIdentifier::new("
-    << to_rust_field_type_enum(elem_type) << ", "
-    << list_var << ".len() as i32" << ")"
-    << ")?;"
-    << endl;
+  f_gen_ << indent() << "o_prot.write_list_begin("
+         << "&TListIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << list_var
+         << ".len() as i32"
+         << ")"
+         << ")?;" << endl;
 
   string ref(list_var_is_ref ? "" : "&");
   f_gen_ << indent() << "for e in " << ref << list_var << " {" << endl;
@@ -1597,17 +1577,16 @@
   f_gen_ << indent() << "o_prot.write_list_end()?;" << endl;
 }
 
-void t_rs_generator::render_set_sync_write(const string &set_var, bool set_var_is_ref, t_set *tset) {
+void t_rs_generator::render_set_sync_write(const string& set_var,
+                                           bool set_var_is_ref,
+                                           t_set* tset) {
   t_type* elem_type = tset->get_elem_type();
 
-  f_gen_
-    << indent()
-    << "o_prot.write_set_begin("
-    << "&TSetIdentifier::new("
-    << to_rust_field_type_enum(elem_type) << ", "
-    << set_var << ".len() as i32" << ")"
-    << ")?;"
-    << endl;
+  f_gen_ << indent() << "o_prot.write_set_begin("
+         << "&TSetIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << set_var
+         << ".len() as i32"
+         << ")"
+         << ")?;" << endl;
 
   string ref(set_var_is_ref ? "" : "&");
   f_gen_ << indent() << "for e in " << ref << set_var << " {" << endl;
@@ -1618,19 +1597,16 @@
   f_gen_ << indent() << "o_prot.write_set_end()?;" << endl;
 }
 
-void t_rs_generator::render_map_sync_write(const string &map_var, bool map_var_is_ref, t_map *tmap) {
+void t_rs_generator::render_map_sync_write(const string& map_var,
+                                           bool map_var_is_ref,
+                                           t_map* tmap) {
   t_type* key_type = tmap->get_key_type();
   t_type* val_type = tmap->get_val_type();
 
-  f_gen_
-    << indent()
-    << "o_prot.write_map_begin("
-    << "&TMapIdentifier::new("
-    << to_rust_field_type_enum(key_type) << ", "
-    << to_rust_field_type_enum(val_type) << ", "
-    << map_var << ".len() as i32)"
-    << ")?;"
-    << endl;
+  f_gen_ << indent() << "o_prot.write_map_begin("
+         << "&TMapIdentifier::new(" << to_rust_field_type_enum(key_type) << ", "
+         << to_rust_field_type_enum(val_type) << ", " << map_var << ".len() as i32)"
+         << ")?;" << endl;
 
   string ref(map_var_is_ref ? "" : "&");
   f_gen_ << indent() << "for (k, v) in " << ref << map_var << " {" << endl;
@@ -1670,14 +1646,12 @@
 //
 //-----------------------------------------------------------------------------
 
-void t_rs_generator::render_struct_sync_read(
-    const string &struct_name,
-    t_struct *tstruct, t_rs_generator::e_struct_type struct_type
-) {
-  f_gen_
-    << indent()
-    << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" << struct_name << "> {"
-    << endl;
+void t_rs_generator::render_struct_sync_read(const string& struct_name,
+                                             t_struct* tstruct,
+                                             t_rs_generator::e_struct_type struct_type) {
+  f_gen_ << indent()
+         << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
+         << struct_name << "> {" << endl;
 
   indent_up();
 
@@ -1690,16 +1664,14 @@
     t_field* member = (*members_iter);
     t_field::e_req member_req = actual_field_req(member, struct_type);
 
-    f_gen_
-      << indent()
-      << "let mut " << struct_field_read_temp_variable(member)
-      << ": Option<" << to_rust_type(member->get_type()) << "> = ";
-      if (member_req == t_field::T_OPT_IN_REQ_OUT) {
-        f_gen_ << opt_in_req_out_value(member->get_type()) << ";";
-      } else {
-        f_gen_ << "None;";
-      }
-      f_gen_ << endl;
+    f_gen_ << indent() << "let mut " << struct_field_read_temp_variable(member) << ": Option<"
+           << to_rust_type(member->get_type()) << "> = ";
+    if (member_req == t_field::T_OPT_IN_REQ_OUT) {
+      f_gen_ << opt_in_req_out_value(member->get_type()) << ";";
+    } else {
+      f_gen_ << "None;";
+    }
+    f_gen_ << endl;
   }
 
   // now loop through the fields we've received
@@ -1746,7 +1718,7 @@
 
   f_gen_ << indent() << "i_prot.read_field_end()?;" << endl;
   indent_down();
-  f_gen_ << indent() << "}" << endl; // finish loop
+  f_gen_ << indent() << "}" << endl;                          // finish loop
   f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // read message footer from the wire
 
   // verify that all required fields exist
@@ -1754,13 +1726,10 @@
     t_field* tfield = (*members_iter);
     t_field::e_req req = actual_field_req(tfield, struct_type);
     if (!is_optional(req)) {
-      f_gen_
-        << indent()
-        << "verify_required_field_exists("
-        << "\"" << struct_name << "." << rust_field_name(tfield) << "\""
-        << ", "
-        << "&" << struct_field_read_temp_variable(tfield)
-        << ")?;" << endl;
+      f_gen_ << indent() << "verify_required_field_exists("
+             << "\"" << struct_name << "." << rust_field_name(tfield) << "\""
+             << ", "
+             << "&" << struct_field_read_temp_variable(tfield) << ")?;" << endl;
     }
   }
 
@@ -1779,14 +1748,10 @@
       if (is_optional(req)) {
         f_gen_ << indent() << field_name << ": " << field_key << "," << endl;
       } else {
-        f_gen_
-          << indent()
-          << field_name
-          << ": "
-          << field_key
-          << ".expect(\"auto-generated code should have checked for presence of required fields\")"
-          << ","
-          << endl;
+        f_gen_ << indent() << field_name << ": " << field_key
+               << ".expect(\"auto-generated code should have checked for presence of required "
+                  "fields\")"
+               << "," << endl;
       }
     }
 
@@ -1801,11 +1766,10 @@
   f_gen_ << indent() << "}" << endl;
 }
 
-void t_rs_generator::render_union_sync_read(const string &union_name, t_struct *tstruct) {
-  f_gen_
-    << indent()
-    << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<" << union_name << "> {"
-    << endl;
+void t_rs_generator::render_union_sync_read(const string& union_name, t_struct* tstruct) {
+  f_gen_ << indent()
+         << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
+         << union_name << "> {" << endl;
   indent_up();
 
   // create temporary variables to hold the
@@ -1842,10 +1806,8 @@
     render_type_sync_read("val", member->get_type());
     f_gen_ << indent() << "if ret.is_none() {" << endl;
     indent_up();
-    f_gen_
-      << indent()
-      << "ret = Some(" << union_name << "::" << rust_union_field_name(member) << "(val));"
-      << endl;
+    f_gen_ << indent() << "ret = Some(" << union_name << "::" << rust_union_field_name(member)
+           << "(val));" << endl;
     indent_down();
     f_gen_ << indent() << "}" << endl;
     f_gen_ << indent() << "received_field_count += 1;" << endl;
@@ -1865,27 +1827,19 @@
   f_gen_ << indent() << "};" << endl; // finish match
   f_gen_ << indent() << "i_prot.read_field_end()?;" << endl;
   indent_down();
-  f_gen_ << indent() << "}" << endl; // finish loop
+  f_gen_ << indent() << "}" << endl;                          // finish loop
   f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // finish reading message from wire
 
   // return the value or an error
   f_gen_ << indent() << "if received_field_count == 0 {" << endl;
   indent_up();
-  render_thrift_error(
-    "Protocol",
-    "ProtocolError",
-    "ProtocolErrorKind::InvalidData",
-    "\"received empty union from remote " + union_name + "\""
-  );
+  render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
+                      "\"received empty union from remote " + union_name + "\"");
   indent_down();
   f_gen_ << indent() << "} else if received_field_count > 1 {" << endl;
   indent_up();
-  render_thrift_error(
-    "Protocol",
-    "ProtocolError",
-    "ProtocolErrorKind::InvalidData",
-    "\"received multiple fields for union from remote " + union_name + "\""
-  );
+  render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
+                      "\"received multiple fields for union from remote " + union_name + "\"");
   indent_down();
   f_gen_ << indent() << "} else {" << endl;
   indent_up();
@@ -1898,7 +1852,7 @@
 }
 
 // Construct the rust representation of all supported types from the wire.
-void t_rs_generator::render_type_sync_read(const string &type_var, t_type *ttype, bool is_boxed) {
+void t_rs_generator::render_type_sync_read(const string& type_var, t_type* ttype, bool is_boxed) {
   if (ttype->is_base_type()) {
     t_base_type* tbase_type = (t_base_type*)ttype;
     switch (tbase_type->get_base()) {
@@ -1911,6 +1865,9 @@
         f_gen_ << indent() << "let " << type_var << " = i_prot.read_string()?;" << endl;
       }
       return;
+    case t_base_type::TYPE_UUID:
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_uuid()?;" << endl;
+      return;
     case t_base_type::TYPE_BOOL:
       f_gen_ << indent() << "let " << type_var << " = i_prot.read_bool()?;" << endl;
       return;
@@ -1927,7 +1884,8 @@
       f_gen_ << indent() << "let " << type_var << " = i_prot.read_i64()?;" << endl;
       return;
     case t_base_type::TYPE_DOUBLE:
-      f_gen_ << indent() << "let " << type_var << " = OrderedFloat::from(i_prot.read_double()?);" << endl;
+      f_gen_ << indent() << "let " << type_var << " = OrderedFloat::from(i_prot.read_double()?);"
+             << endl;
       return;
     default:
       throw "compiler error: unhandled type";
@@ -1947,19 +1905,16 @@
   } else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) {
     string read_call(to_rust_type(ttype) + "::read_from_in_protocol(i_prot)?");
     read_call = is_boxed ? "Box::new(" + read_call + ")" : read_call;
-    f_gen_
-      << indent()
-      << "let " << type_var << " = " <<  read_call << ";"
-      << endl;
+    f_gen_ << indent() << "let " << type_var << " = " << read_call << ";" << endl;
     return;
   } else if (ttype->is_map()) {
-    render_map_sync_read((t_map *) ttype, type_var);
+    render_map_sync_read((t_map*)ttype, type_var);
     return;
   } else if (ttype->is_set()) {
-    render_set_sync_read((t_set *) ttype, type_var);
+    render_set_sync_read((t_set*)ttype, type_var);
     return;
   } else if (ttype->is_list()) {
-    render_list_sync_read((t_list *) ttype, type_var);
+    render_list_sync_read((t_list*)ttype, type_var);
     return;
   }
 
@@ -1967,15 +1922,12 @@
 }
 
 // Construct the rust representation of a list from the wire.
-void t_rs_generator::render_list_sync_read(t_list *tlist, const string &list_var) {
+void t_rs_generator::render_list_sync_read(t_list* tlist, const string& list_var) {
   t_type* elem_type = tlist->get_elem_type();
 
   f_gen_ << indent() << "let list_ident = i_prot.read_list_begin()?;" << endl;
-  f_gen_
-    << indent()
-    << "let mut " << list_var << ": " << to_rust_type((t_type*) tlist)
-    << " = Vec::with_capacity(list_ident.size as usize);"
-    << endl;
+  f_gen_ << indent() << "let mut " << list_var << ": " << to_rust_type((t_type*)tlist)
+         << " = Vec::with_capacity(list_ident.size as usize);" << endl;
   f_gen_ << indent() << "for _ in 0..list_ident.size {" << endl;
 
   indent_up();
@@ -1991,15 +1943,12 @@
 }
 
 // Construct the rust representation of a set from the wire.
-void t_rs_generator::render_set_sync_read(t_set *tset, const string &set_var) {
+void t_rs_generator::render_set_sync_read(t_set* tset, const string& set_var) {
   t_type* elem_type = tset->get_elem_type();
 
   f_gen_ << indent() << "let set_ident = i_prot.read_set_begin()?;" << endl;
-  f_gen_
-    << indent()
-    << "let mut " << set_var << ": " << to_rust_type((t_type*) tset)
-    << " = BTreeSet::new();"
-    << endl;
+  f_gen_ << indent() << "let mut " << set_var << ": " << to_rust_type((t_type*)tset)
+         << " = BTreeSet::new();" << endl;
   f_gen_ << indent() << "for _ in 0..set_ident.size {" << endl;
 
   indent_up();
@@ -2015,16 +1964,13 @@
 }
 
 // Construct the rust representation of a map from the wire.
-void t_rs_generator::render_map_sync_read(t_map *tmap, const string &map_var) {
+void t_rs_generator::render_map_sync_read(t_map* tmap, const string& map_var) {
   t_type* key_type = tmap->get_key_type();
   t_type* val_type = tmap->get_val_type();
 
   f_gen_ << indent() << "let map_ident = i_prot.read_map_begin()?;" << endl;
-  f_gen_
-    << indent()
-    << "let mut " << map_var << ": " << to_rust_type((t_type*) tmap)
-    << " = BTreeMap::new();"
-    << endl;
+  f_gen_ << indent() << "let mut " << map_var << ": " << to_rust_type((t_type*)tmap)
+         << " = BTreeMap::new();" << endl;
   f_gen_ << indent() << "for _ in 0..map_ident.size {" << endl;
 
   indent_up();
@@ -2033,7 +1979,8 @@
   render_type_sync_read(key_elem_var, key_type);
   string val_elem_var = tmp("map_val_");
   render_type_sync_read(val_elem_var, val_type);
-  f_gen_ << indent() << map_var << ".insert(" << key_elem_var << ", " << val_elem_var << ");" << endl;
+  f_gen_ << indent() << map_var << ".insert(" << key_elem_var << ", " << val_elem_var << ");"
+         << endl;
 
   indent_down();
 
@@ -2071,7 +2018,7 @@
   // that's passed over the wire, so, generate the struct
   // for that too. Note that this result struct *also*
   // contains the exceptions as well
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
     render_service_call_args_struct(tfunc);
     if (!tfunc->is_oneway()) {
@@ -2088,30 +2035,32 @@
   render_sync_client_marker_trait(tservice);
   render_sync_client_definition_and_impl(client_impl_name);
   render_sync_client_tthriftclient_impl(client_impl_name);
-  render_sync_client_marker_trait_impls(tservice, client_impl_name); f_gen_ << endl;
+  render_sync_client_marker_trait_impls(tservice, client_impl_name);
+  f_gen_ << endl;
   render_sync_client_process_impl(tservice);
 }
 
-void t_rs_generator::render_sync_client_trait(t_service *tservice) {
+void t_rs_generator::render_sync_client_trait(t_service* tservice) {
   string extension = "";
   if (tservice->get_extends()) {
     t_service* extends = tservice->get_extends();
     extension = " : " + rust_namespace(extends) + rust_sync_client_trait_name(extends);
   }
 
-  render_rustdoc((t_doc*) tservice);
+  render_rustdoc((t_doc*)tservice);
   f_gen_ << "pub trait " << rust_sync_client_trait_name(tservice) << extension << " {" << endl;
   indent_up();
 
   const std::vector<t_function*> functions = tservice->get_functions();
   std::vector<t_function*>::const_iterator func_iter;
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
     string func_name = service_call_client_function_name(tfunc);
     string func_args = rust_sync_service_call_declaration(tfunc, true);
     string func_return = to_rust_type(tfunc->get_returntype());
-    render_rustdoc((t_doc*) tfunc);
-    f_gen_ << indent() << "fn " << func_name <<  func_args << " -> thrift::Result<" << func_return << ">;" << endl;
+    render_rustdoc((t_doc*)tfunc);
+    f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return
+           << ">;" << endl;
   }
 
   indent_down();
@@ -2119,24 +2068,17 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_sync_client_marker_trait(t_service *tservice) {
-  f_gen_ << indent() << "pub trait " << rust_sync_client_marker_trait_name(tservice) << " {}" << endl;
+void t_rs_generator::render_sync_client_marker_trait(t_service* tservice) {
+  f_gen_ << indent() << "pub trait " << rust_sync_client_marker_trait_name(tservice) << " {}"
+         << endl;
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_sync_client_marker_trait_impls(t_service *tservice, const string &impl_struct_name) {
-  f_gen_
-    << indent()
-    << "impl "
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " "
-    << rust_namespace(tservice) << rust_sync_client_marker_trait_name(tservice)
-    << " for "
-    << impl_struct_name << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " "
-    << SYNC_CLIENT_GENERIC_BOUNDS
-    << " {}"
-    << endl;
+void t_rs_generator::render_sync_client_marker_trait_impls(t_service* tservice,
+                                                           const string& impl_struct_name) {
+  f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << rust_namespace(tservice)
+         << rust_sync_client_marker_trait_name(tservice) << " for " << impl_struct_name
+         << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {}" << endl;
 
   t_service* extends = tservice->get_extends();
   if (extends) {
@@ -2147,14 +2089,8 @@
 void t_rs_generator::render_sync_client_definition_and_impl(const string& client_impl_name) {
 
   // render the definition for the client struct
-  f_gen_
-    << "pub struct "
-    << client_impl_name
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " "
-    << SYNC_CLIENT_GENERIC_BOUNDS
-    << " {"
-    << endl;
+  f_gen_ << "pub struct " << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " "
+         << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl;
   indent_up();
   f_gen_ << indent() << "_i_prot: IP," << endl;
   f_gen_ << indent() << "_o_prot: OP," << endl;
@@ -2165,16 +2101,8 @@
 
   // render the struct implementation
   // this includes the new() function as well as the helper send/recv methods for each service call
-  f_gen_
-    << "impl "
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " "
-    << client_impl_name
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " "
-    << SYNC_CLIENT_GENERIC_BOUNDS
-    << " {"
-    << endl;
+  f_gen_ << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << client_impl_name
+         << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl;
   indent_up();
   render_sync_client_lifecycle_functions(client_impl_name);
   indent_down();
@@ -2183,45 +2111,32 @@
 }
 
 void t_rs_generator::render_sync_client_lifecycle_functions(const string& client_struct) {
-  f_gen_
-    << indent()
-    << "pub fn new(input_protocol: IP, output_protocol: OP) -> "
-    << client_struct
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " {"
-    << endl;
+  f_gen_ << indent() << "pub fn new(input_protocol: IP, output_protocol: OP) -> " << client_struct
+         << SYNC_CLIENT_GENERIC_BOUND_VARS << " {" << endl;
   indent_up();
 
-  f_gen_
-    << indent()
-    << client_struct
-    << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }"
-    << endl;
+  f_gen_ << indent() << client_struct
+         << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }" << endl;
 
   indent_down();
   f_gen_ << indent() << "}" << endl;
 }
 
-void t_rs_generator::render_sync_client_tthriftclient_impl(const string &client_impl_name) {
-  f_gen_
-    << indent()
-    << "impl "
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " TThriftClient for "
-    << client_impl_name
-    << SYNC_CLIENT_GENERIC_BOUND_VARS
-    << " "
-    << SYNC_CLIENT_GENERIC_BOUNDS
-    << " {" << endl;
+void t_rs_generator::render_sync_client_tthriftclient_impl(const string& client_impl_name) {
+  f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " TThriftClient for "
+         << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS
+         << " {" << endl;
   indent_up();
 
-  f_gen_ << indent() << "fn i_prot_mut(&mut self) -> &mut dyn TInputProtocol { &mut self._i_prot }" << endl;
-  f_gen_ << indent() << "fn o_prot_mut(&mut self) -> &mut dyn TOutputProtocol { &mut self._o_prot }" << endl;
+  f_gen_ << indent() << "fn i_prot_mut(&mut self) -> &mut dyn TInputProtocol { &mut self._i_prot }"
+         << endl;
+  f_gen_ << indent() << "fn o_prot_mut(&mut self) -> &mut dyn TOutputProtocol { &mut self._o_prot }"
+         << endl;
   f_gen_ << indent() << "fn sequence_number(&self) -> i32 { self._sequence_number }" << endl;
-  f_gen_
-    << indent()
-    << "fn increment_sequence_number(&mut self) -> i32 { self._sequence_number += 1; self._sequence_number }"
-    << endl;
+  f_gen_ << indent()
+         << "fn increment_sequence_number(&mut self) -> i32 { self._sequence_number += 1; "
+            "self._sequence_number }"
+         << endl;
 
   indent_down();
   f_gen_ << indent() << "}" << endl;
@@ -2231,15 +2146,13 @@
 void t_rs_generator::render_sync_client_process_impl(t_service* tservice) {
   string marker_extension = "" + sync_client_marker_traits_for_extension(tservice);
 
-  f_gen_
-    << "impl <C: TThriftClient + " << rust_sync_client_marker_trait_name(tservice) << marker_extension << "> "
-    << rust_sync_client_trait_name(tservice)
-    << " for C {" << endl;
+  f_gen_ << "impl <C: TThriftClient + " << rust_sync_client_marker_trait_name(tservice)
+         << marker_extension << "> " << rust_sync_client_trait_name(tservice) << " for C {" << endl;
   indent_up();
 
   const std::vector<t_function*> functions = tservice->get_functions();
   std::vector<t_function*>::const_iterator func_iter;
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* func = (*func_iter);
     render_sync_send_recv_wrapper(func);
   }
@@ -2249,12 +2162,13 @@
   f_gen_ << endl;
 }
 
-string t_rs_generator::sync_client_marker_traits_for_extension(t_service *tservice) {
+string t_rs_generator::sync_client_marker_traits_for_extension(t_service* tservice) {
   string marker_extension;
 
   t_service* extends = tservice->get_extends();
   if (extends) {
-    marker_extension = " + " + rust_namespace(extends) + rust_sync_client_marker_trait_name(extends);
+    marker_extension
+        = " + " + rust_namespace(extends) + rust_sync_client_marker_trait_name(extends);
     marker_extension = marker_extension + sync_client_marker_traits_for_extension(extends);
   }
 
@@ -2267,11 +2181,8 @@
   string func_call_args = rust_sync_service_call_invocation(tfunc);
   string func_return = to_rust_type(tfunc->get_returntype());
 
-  f_gen_
-    << indent()
-    << "fn " << func_name <<  func_decl_args << " -> thrift::Result<" << func_return
-    << "> {"
-    << endl;
+  f_gen_ << indent() << "fn " << func_name << func_decl_args << " -> thrift::Result<" << func_return
+         << "> {" << endl;
   indent_up();
 
   f_gen_ << indent() << "(" << endl;
@@ -2296,13 +2207,10 @@
   // increment the sequence number and generate the call header
   string message_type = tfunc->is_oneway() ? "TMessageType::OneWay" : "TMessageType::Call";
   f_gen_ << indent() << "self.increment_sequence_number();" << endl;
-  f_gen_
-    << indent()
-    << "let message_ident = "
-    << "TMessageIdentifier::new(\"" << tfunc->get_name() << "\", " // note: use *original* name
-    << message_type << ", "
-    << "self.sequence_number());"
-    << endl;
+  f_gen_ << indent() << "let message_ident = "
+         << "TMessageIdentifier::new(\"" << tfunc->get_name() << "\", " // note: use *original* name
+         << message_type << ", "
+         << "self.sequence_number());" << endl;
   // pack the arguments into the containing struct that we'll write out over the wire
   // note that this struct is generated even if we have 0 args
   ostringstream struct_definition;
@@ -2317,17 +2225,12 @@
   if (struct_fields.size() > 0) {
     struct_fields = struct_fields.substr(0, struct_fields.size() - 2); // strip trailing comma
   }
-  f_gen_
-    << indent()
-    << "let call_args = "
-    << service_call_args_struct_name(tfunc)
-    << " { "
-    << struct_fields
-    << " };"
-    << endl;
+  f_gen_ << indent() << "let call_args = " << service_call_args_struct_name(tfunc) << " { "
+         << struct_fields << " };" << endl;
   // write everything over the wire
   f_gen_ << indent() << "self.o_prot_mut().write_message_begin(&message_ident)?;" << endl;
-  f_gen_ << indent() << "call_args.write_to_out_protocol(self.o_prot_mut())?;" << endl; // written even if we have 0 args
+  f_gen_ << indent() << "call_args.write_to_out_protocol(self.o_prot_mut())?;"
+         << endl; // written even if we have 0 args
   f_gen_ << indent() << "self.o_prot_mut().write_message_end()?;" << endl;
   f_gen_ << indent() << "self.o_prot_mut().flush()" << endl;
 
@@ -2340,18 +2243,28 @@
   indent_up();
 
   f_gen_ << indent() << "let message_ident = self.i_prot_mut().read_message_begin()?;" << endl;
-  f_gen_ << indent() << "verify_expected_sequence_number(self.sequence_number(), message_ident.sequence_number)?;" << endl;
-  f_gen_ << indent() << "verify_expected_service_call(\"" << tfunc->get_name() <<"\", &message_ident.name)?;" << endl; // note: use *original* name
+  f_gen_
+      << indent()
+      << "verify_expected_sequence_number(self.sequence_number(), message_ident.sequence_number)?;"
+      << endl;
+  f_gen_ << indent() << "verify_expected_service_call(\"" << tfunc->get_name()
+         << "\", &message_ident.name)?;" << endl; // note: use *original* name
   // FIXME: replace with a "try" block
   f_gen_ << indent() << "if message_ident.message_type == TMessageType::Exception {" << endl;
   indent_up();
-  f_gen_ << indent() << "let remote_error = thrift::Error::read_application_error_from_in_protocol(self.i_prot_mut())?;" << endl;
+  f_gen_ << indent()
+         << "let remote_error = "
+            "thrift::Error::read_application_error_from_in_protocol(self.i_prot_mut())?;"
+         << endl;
   f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl;
   f_gen_ << indent() << "return Err(thrift::Error::Application(remote_error))" << endl;
   indent_down();
   f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "verify_expected_message_type(TMessageType::Reply, message_ident.message_type)?;" << endl;
-  f_gen_ << indent() << "let result = " << service_call_result_struct_name(tfunc) << "::read_from_in_protocol(self.i_prot_mut())?;" << endl;
+  f_gen_ << indent()
+         << "verify_expected_message_type(TMessageType::Reply, message_ident.message_type)?;"
+         << endl;
+  f_gen_ << indent() << "let result = " << service_call_result_struct_name(tfunc)
+         << "::read_from_in_protocol(self.i_prot_mut())?;" << endl;
   f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl;
   f_gen_ << indent() << "result.ok_or()" << endl;
 
@@ -2377,7 +2290,8 @@
   return func_args.str();
 }
 
-string t_rs_generator::rust_sync_service_call_invocation(t_function* tfunc, const string& field_prefix) {
+string t_rs_generator::rust_sync_service_call_invocation(t_function* tfunc,
+                                                         const string& field_prefix) {
   ostringstream func_args;
   func_args << "(";
 
@@ -2389,7 +2303,8 @@
   return func_args.str();
 }
 
-string t_rs_generator::struct_to_declaration(t_struct* tstruct, t_rs_generator::e_struct_type struct_type) {
+string t_rs_generator::struct_to_declaration(t_struct* tstruct,
+                                             t_rs_generator::e_struct_type struct_type) {
   ostringstream args;
 
   bool first_arg = true;
@@ -2435,8 +2350,8 @@
 }
 
 void t_rs_generator::render_service_call_args_struct(t_function* tfunc) {
-    string args_struct_name(service_call_args_struct_name(tfunc));
-    render_struct(args_struct_name, tfunc->get_arglist(), t_rs_generator::T_ARGS);
+  string args_struct_name(service_call_args_struct_name(tfunc));
+  render_struct(args_struct_name, tfunc->get_arglist(), t_rs_generator::T_ARGS);
 }
 
 void t_rs_generator::render_service_call_result_value_struct(t_function* tfunc) {
@@ -2452,7 +2367,8 @@
   t_struct* exceptions = tfunc->get_xceptions();
   const vector<t_field*>& exception_types = exceptions->get_members();
   vector<t_field*>::const_iterator exception_iter;
-  for(exception_iter = exception_types.begin(); exception_iter != exception_types.end(); ++exception_iter) {
+  for (exception_iter = exception_types.begin(); exception_iter != exception_types.end();
+       ++exception_iter) {
     t_field* exception_type = *exception_iter;
     exception_type->set_req(t_field::T_OPTIONAL);
     result.append(exception_type);
@@ -2467,13 +2383,13 @@
 //
 //-----------------------------------------------------------------------------
 
-void t_rs_generator::render_sync_processor(t_service *tservice) {
+void t_rs_generator::render_sync_processor(t_service* tservice) {
   render_type_comment(tservice->get_name() + " service processor"); // note: use *original* name
   render_sync_handler_trait(tservice);
   render_sync_processor_definition_and_impl(tservice);
 }
 
-void t_rs_generator::render_sync_handler_trait(t_service *tservice) {
+void t_rs_generator::render_sync_handler_trait(t_service* tservice) {
   string extension = "";
   if (tservice->get_extends() != nullptr) {
     t_service* extends = tservice->get_extends();
@@ -2483,38 +2399,30 @@
   const std::vector<t_function*> functions = tservice->get_functions();
   std::vector<t_function*>::const_iterator func_iter;
 
-  render_rustdoc((t_doc*) tservice);
+  render_rustdoc((t_doc*)tservice);
   f_gen_ << "pub trait " << rust_sync_handler_trait_name(tservice) << extension << " {" << endl;
   indent_up();
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
     string func_name = service_call_handler_function_name(tfunc);
     string func_args = rust_sync_service_call_declaration(tfunc, false);
     string func_return = to_rust_type(tfunc->get_returntype());
-    render_rustdoc((t_doc*) tfunc);
-    f_gen_
-      << indent()
-      << "fn "
-      << func_name <<  func_args
-      << " -> thrift::Result<" << func_return << ">;"
-      << endl;
+    render_rustdoc((t_doc*)tfunc);
+    f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return
+           << ">;" << endl;
   }
   indent_down();
   f_gen_ << indent() << "}" << endl;
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_sync_processor_definition_and_impl(t_service *tservice) {
+void t_rs_generator::render_sync_processor_definition_and_impl(t_service* tservice) {
   string service_processor_name = rust_sync_processor_name(tservice);
   string handler_trait_name = rust_sync_handler_trait_name(tservice);
 
   // struct
-  f_gen_
-    << indent()
-    << "pub struct " << service_processor_name
-    << "<H: " << handler_trait_name
-    << "> {"
-    << endl;
+  f_gen_ << indent() << "pub struct " << service_processor_name << "<H: " << handler_trait_name
+         << "> {" << endl;
   indent_up();
   f_gen_ << indent() << "handler: H," << endl;
   indent_down();
@@ -2522,12 +2430,8 @@
   f_gen_ << endl;
 
   // delegating impl
-  f_gen_
-    << indent()
-    << "impl <H: " << handler_trait_name << "> "
-    << service_processor_name
-    << "<H> {"
-    << endl;
+  f_gen_ << indent() << "impl <H: " << handler_trait_name << "> " << service_processor_name
+         << "<H> {" << endl;
   indent_up();
   f_gen_ << indent() << "pub fn new(handler: H) -> " << service_processor_name << "<H> {" << endl;
   indent_up();
@@ -2552,7 +2456,7 @@
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator func_iter;
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
     render_sync_process_function(tfunc, handler_trait_name);
   }
@@ -2562,40 +2466,33 @@
   f_gen_ << endl;
 
   // processor impl
-  f_gen_
-    << indent()
-    << "impl <H: "
-    << handler_trait_name << "> TProcessor for "
-    << service_processor_name
-    << "<H> {"
-    << endl;
+  f_gen_ << indent() << "impl <H: " << handler_trait_name << "> TProcessor for "
+         << service_processor_name << "<H> {" << endl;
   indent_up();
 
-  f_gen_
-    << indent()
-    << "fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-    << endl;
+  f_gen_ << indent()
+         << "fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) "
+            "-> thrift::Result<()> {"
+         << endl;
   indent_up();
 
   f_gen_ << indent() << "let message_ident = i_prot.read_message_begin()?;" << endl;
 
-  f_gen_ << indent() << "let res = match &*message_ident.name {" << endl; // [sigh] explicit deref coercion
+  f_gen_ << indent() << "let res = match &*message_ident.name {"
+         << endl; // [sigh] explicit deref coercion
   indent_up();
   render_process_match_statements(tservice);
   f_gen_ << indent() << "method => {" << endl;
   indent_up();
-  render_thrift_error(
-    "Application",
-    "ApplicationError",
-    "ApplicationErrorKind::UnknownMethod",
-    "format!(\"unknown method {}\", method)"
-  );
+  render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::UnknownMethod",
+                      "format!(\"unknown method {}\", method)");
   indent_down();
   f_gen_ << indent() << "}," << endl;
 
   indent_down();
   f_gen_ << indent() << "};" << endl;
-  f_gen_ << indent() << "thrift::server::handle_process_result(&message_ident, res, o_prot)" << endl;
+  f_gen_ << indent() << "thrift::server::handle_process_result(&message_ident, res, o_prot)"
+         << endl;
 
   indent_down();
   f_gen_ << indent() << "}" << endl;
@@ -2605,36 +2502,27 @@
   f_gen_ << endl;
 }
 
-void t_rs_generator::render_sync_process_delegation_functions(t_service *tservice) {
+void t_rs_generator::render_sync_process_delegation_functions(t_service* tservice) {
   string actual_processor(rust_namespace(tservice) + rust_sync_processor_impl_name(tservice));
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator func_iter;
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
     string function_name("process_" + rust_snake_case(tfunc->get_name()));
-    f_gen_
-      << indent()
-      << "fn " << function_name
-      << "(&self, "
-      << "incoming_sequence_number: i32, "
-      << "i_prot: &mut dyn TInputProtocol, "
-      << "o_prot: &mut dyn TOutputProtocol) "
-      << "-> thrift::Result<()> {"
-      << endl;
+    f_gen_ << indent() << "fn " << function_name << "(&self, "
+           << "incoming_sequence_number: i32, "
+           << "i_prot: &mut dyn TInputProtocol, "
+           << "o_prot: &mut dyn TOutputProtocol) "
+           << "-> thrift::Result<()> {" << endl;
     indent_up();
 
-    f_gen_
-      << indent()
-      << actual_processor
-      << "::" << function_name
-      << "("
-      << "&self.handler, "
-      << "incoming_sequence_number, "
-      << "i_prot, "
-      << "o_prot"
-      << ")"
-      << endl;
+    f_gen_ << indent() << actual_processor << "::" << function_name << "("
+           << "&self.handler, "
+           << "incoming_sequence_number, "
+           << "i_prot, "
+           << "o_prot"
+           << ")" << endl;
 
     indent_down();
     f_gen_ << indent() << "}" << endl;
@@ -2649,15 +2537,13 @@
 void t_rs_generator::render_process_match_statements(t_service* tservice) {
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator func_iter;
-  for(func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
+  for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
-    f_gen_ << indent() << "\"" << tfunc->get_name() << "\"" << " => {" << endl; // note: use *original* name
+    f_gen_ << indent() << "\"" << tfunc->get_name() << "\""
+           << " => {" << endl; // note: use *original* name
     indent_up();
-    f_gen_
-      << indent()
-      << "self.process_" << rust_snake_case(tfunc->get_name())
-      << "(message_ident.sequence_number, i_prot, o_prot)"
-      << endl;
+    f_gen_ << indent() << "self.process_" << rust_snake_case(tfunc->get_name())
+           << "(message_ident.sequence_number, i_prot, o_prot)" << endl;
     indent_down();
     f_gen_ << indent() << "}," << endl;
   }
@@ -2668,7 +2554,7 @@
   }
 }
 
-void t_rs_generator::render_sync_process_function(t_function *tfunc, const string &handler_type) {
+void t_rs_generator::render_sync_process_function(t_function* tfunc, const string& handler_type) {
   string sequence_number_param("incoming_sequence_number");
   string output_protocol_param("o_prot");
 
@@ -2677,40 +2563,26 @@
     output_protocol_param = "_";
   }
 
-  f_gen_
-    << indent()
-    << "pub fn process_" << rust_snake_case(tfunc->get_name())
-    << "<H: " << handler_type << ">"
-    << "(handler: &H, "
-    << sequence_number_param << ": i32, "
-    << "i_prot: &mut dyn TInputProtocol, "
-    << output_protocol_param << ": &mut dyn TOutputProtocol) "
-    << "-> thrift::Result<()> {"
-    << endl;
+  f_gen_ << indent() << "pub fn process_" << rust_snake_case(tfunc->get_name())
+         << "<H: " << handler_type << ">"
+         << "(handler: &H, " << sequence_number_param << ": i32, "
+         << "i_prot: &mut dyn TInputProtocol, " << output_protocol_param
+         << ": &mut dyn TOutputProtocol) "
+         << "-> thrift::Result<()> {" << endl;
 
   indent_up();
 
   // *always* read arguments from the input protocol
-  f_gen_
-    << indent()
-    << "let "
-    << (has_non_void_args(tfunc) ? "args" : "_")
-    << " = "
-    << service_call_args_struct_name(tfunc)
-    << "::read_from_in_protocol(i_prot)?;"
-    << endl;
+  f_gen_ << indent() << "let " << (has_non_void_args(tfunc) ? "args" : "_") << " = "
+         << service_call_args_struct_name(tfunc) << "::read_from_in_protocol(i_prot)?;" << endl;
 
-  f_gen_
-    << indent()
-    << "match handler."
-    << service_call_handler_function_name(tfunc)
-    << rust_sync_service_call_invocation(tfunc, "args.")
-    << " {"
-    << endl; // start match
+  f_gen_ << indent() << "match handler." << service_call_handler_function_name(tfunc)
+         << rust_sync_service_call_invocation(tfunc, "args.") << " {" << endl; // start match
   indent_up();
 
   // handler succeeded
-  string handler_return_variable = tfunc->is_oneway() || tfunc->get_returntype()->is_void() ? "_" : "handler_return";
+  string handler_return_variable
+      = tfunc->is_oneway() || tfunc->get_returntype()->is_void() ? "_" : "handler_return";
   f_gen_ << indent() << "Ok(" << handler_return_variable << ") => {" << endl;
   indent_up();
   render_sync_handler_succeeded(tfunc);
@@ -2730,33 +2602,31 @@
   f_gen_ << indent() << "}" << endl; // end function
 }
 
-void t_rs_generator::render_sync_handler_succeeded(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_succeeded(t_function* tfunc) {
   if (tfunc->is_oneway()) {
     f_gen_ << indent() << "Ok(())" << endl;
   } else {
-    f_gen_
-      << indent()
-      << "let message_ident = TMessageIdentifier::new("
-      << "\"" << tfunc->get_name() << "\", " // note: use *original* name
-      << "TMessageType::Reply, "
-      << "incoming_sequence_number);"
-      << endl;
+    f_gen_ << indent() << "let message_ident = TMessageIdentifier::new("
+           << "\"" << tfunc->get_name() << "\", " // note: use *original* name
+           << "TMessageType::Reply, "
+           << "incoming_sequence_number);" << endl;
     f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
-    f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) <<";" << endl;
+    f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) << ";" << endl;
     f_gen_ << indent() << "ret.write_to_out_protocol(o_prot)?;" << endl;
     f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
     f_gen_ << indent() << "o_prot.flush()" << endl;
   }
 }
 
-void t_rs_generator::render_sync_handler_failed(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_failed(t_function* tfunc) {
   string err_var("e");
 
   f_gen_ << indent() << "match " << err_var << " {" << endl;
   indent_up();
 
   // if there are any user-defined exceptions for this service call handle them first
-  if (tfunc->get_xceptions() != nullptr && tfunc->get_xceptions()->get_sorted_members().size() > 0) {
+  if (tfunc->get_xceptions() != nullptr
+      && tfunc->get_xceptions()->get_sorted_members().size() > 0) {
     string user_err_var("usr_err");
     f_gen_ << indent() << "thrift::Error::User(" << user_err_var << ") => {" << endl;
     indent_up();
@@ -2784,7 +2654,7 @@
   f_gen_ << indent() << "}" << endl;
 }
 
-void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function* tfunc) {
   if (tfunc->get_xceptions() == nullptr || tfunc->get_xceptions()->get_sorted_members().empty()) {
     throw "cannot render user exception branches if no user exceptions defined";
   }
@@ -2799,13 +2669,12 @@
 
     string if_statement(branches_rendered == 0 ? "if usr_err" : "} else if usr_err");
     string exception_type(to_rust_type(xception_field->get_type()));
-    f_gen_ << indent() << if_statement << ".downcast_ref::<" << exception_type << ">().is_some() {" << endl;
+    f_gen_ << indent() << if_statement << ".downcast_ref::<" << exception_type << ">().is_some() {"
+           << endl;
     indent_up();
 
-    f_gen_
-      << indent()
-      << "let err = usr_err.downcast::<" << exception_type << ">().expect(\"downcast already checked\");"
-      << endl;
+    f_gen_ << indent() << "let err = usr_err.downcast::<" << exception_type
+           << ">().expect(\"downcast already checked\");" << endl;
 
     // render the members of the return struct
     ostringstream members;
@@ -2816,7 +2685,8 @@
     }
 
     vector<t_field*>::const_iterator xception_members_iter;
-    for(xception_members_iter = txceptions.begin(); xception_members_iter != txceptions.end(); ++xception_members_iter) {
+    for (xception_members_iter = txceptions.begin(); xception_members_iter != txceptions.end();
+         ++xception_members_iter) {
       t_field* member = (*xception_members_iter);
       string member_name(rust_field_name(member));
       if (member == xception_field) {
@@ -2830,21 +2700,14 @@
     member_string.replace(member_string.size() - 2, 2, " "); // trim trailing comma
 
     // now write out the return struct
-    f_gen_
-      << indent()
-      << "let ret_err = "
-      << service_call_result_struct_name(tfunc)
-      << "{ " << member_string << "};"
-      << endl;
+    f_gen_ << indent() << "let ret_err = " << service_call_result_struct_name(tfunc) << "{ "
+           << member_string << "};" << endl;
 
-    f_gen_
-      << indent()
-      << "let message_ident = "
-      << "TMessageIdentifier::new("
-      << "\"" << tfunc->get_name() << "\", " // note: use *original* name
-      << "TMessageType::Reply, "
-      << "incoming_sequence_number);"
-      << endl;
+    f_gen_ << indent() << "let message_ident = "
+           << "TMessageIdentifier::new("
+           << "\"" << tfunc->get_name() << "\", " // note: use *original* name
+           << "TMessageType::Reply, "
+           << "incoming_sequence_number);" << endl;
     f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
     f_gen_ << indent() << "ret_err.write_to_out_protocol(o_prot)?;" << endl;
     f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
@@ -2863,7 +2726,8 @@
 
   f_gen_ << indent() << "let ret_err = {" << endl;
   indent_up();
-  render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "usr_err.to_string()");
+  render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown",
+                             "usr_err.to_string()");
   indent_down();
   f_gen_ << indent() << "};" << endl;
   render_sync_handler_send_exception_response(tfunc, "ret_err");
@@ -2873,9 +2737,8 @@
 }
 
 void t_rs_generator::render_sync_handler_failed_application_exception_branch(
-    t_function *tfunc,
-    const string &app_err_var
-) {
+    t_function* tfunc,
+    const string& app_err_var) {
   if (tfunc->is_oneway()) {
     f_gen_ << indent() << "Err(thrift::Error::Application(" << app_err_var << "))" << endl;
   } else {
@@ -2883,7 +2746,7 @@
   }
 }
 
-void t_rs_generator::render_sync_handler_failed_default_exception_branch(t_function *tfunc) {
+void t_rs_generator::render_sync_handler_failed_default_exception_branch(t_function* tfunc) {
   f_gen_ << indent() << "let ret_err = {" << endl;
   indent_up();
   render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "e.to_string()");
@@ -2896,16 +2759,15 @@
   }
 }
 
-void t_rs_generator::render_sync_handler_send_exception_response(t_function *tfunc, const string &err_var) {
-  f_gen_
-      << indent()
-      << "let message_ident = TMessageIdentifier::new("
-      << "\"" << tfunc->get_name() << "\", " // note: use *original* name
-      << "TMessageType::Exception, "
-      << "incoming_sequence_number);"
-      << endl;
+void t_rs_generator::render_sync_handler_send_exception_response(t_function* tfunc,
+                                                                 const string& err_var) {
+  f_gen_ << indent() << "let message_ident = TMessageIdentifier::new("
+         << "\"" << tfunc->get_name() << "\", " // note: use *original* name
+         << "TMessageType::Exception, "
+         << "incoming_sequence_number);" << endl;
   f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
-  f_gen_ << indent() << "thrift::Error::write_application_error_to_out_protocol(&" << err_var << ", o_prot)?;" << endl;
+  f_gen_ << indent() << "thrift::Error::write_application_error_to_out_protocol(&" << err_var
+         << ", o_prot)?;" << endl;
   f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
   f_gen_ << indent() << "o_prot.flush()" << endl;
 }
@@ -2929,7 +2791,9 @@
     vector<t_field*>::const_iterator members_iter;
     for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
       t_field* xception_field = (*members_iter);
-      if (member_count > 0) { return_struct << ", "; }
+      if (member_count > 0) {
+        return_struct << ", ";
+      }
       return_struct << rust_field_name(xception_field) << ": None";
       member_count++;
     }
@@ -2937,7 +2801,7 @@
 
   return_struct << " }";
 
-  return  return_struct.str();
+  return return_struct.str();
 }
 
 //-----------------------------------------------------------------------------
@@ -2963,12 +2827,10 @@
   generate_docstring_comment(f_gen_, "", "/// ", tdoc->get_doc(), "");
 }
 
-void t_rs_generator::render_thrift_error(
-  const string& error_kind,
-  const string& error_struct,
-  const string& sub_error_kind,
-  const string& error_message
-) {
+void t_rs_generator::render_thrift_error(const string& error_kind,
+                                         const string& error_struct,
+                                         const string& sub_error_kind,
+                                         const string& error_message) {
   f_gen_ << indent() << "Err(" << endl;
   indent_up();
   f_gen_ << indent() << "thrift::Error::" << error_kind << "(" << endl;
@@ -2980,11 +2842,9 @@
   f_gen_ << indent() << ")" << endl;
 }
 
-void t_rs_generator::render_thrift_error_struct(
-  const string& error_struct,
-  const string& sub_error_kind,
-  const string& error_message
-) {
+void t_rs_generator::render_thrift_error_struct(const string& error_struct,
+                                                const string& sub_error_kind,
+                                                const string& error_message) {
   f_gen_ << indent() << error_struct << "::new(" << endl;
   indent_up();
   f_gen_ << indent() << sub_error_kind << "," << endl;
@@ -3018,6 +2878,8 @@
       } else {
         return "String";
       }
+    case t_base_type::TYPE_UUID:
+      return "uuid::Uuid";
     case t_base_type::TYPE_BOOL:
       return "bool";
     case t_base_type::TYPE_I8:
@@ -3036,7 +2898,7 @@
   } else if (ttype->is_typedef()) {
     t_typedef* ttypedef = (t_typedef*)ttype;
     string rust_type = rust_namespace(ttype) + ttypedef->get_symbolic();
-    rust_type =  ttypedef->is_forward_typedef() ? "Box<" + rust_type + ">" : rust_type;
+    rust_type = ttypedef->is_forward_typedef() ? "Box<" + rust_type + ">" : rust_type;
     return rust_type;
   } else if (ttype->is_enum()) {
     return rust_namespace(ttype) + rust_camel_case(ttype->get_name());
@@ -3044,7 +2906,8 @@
     return rust_namespace(ttype) + rust_camel_case(ttype->get_name());
   } else if (ttype->is_map()) {
     t_map* tmap = (t_map*)ttype;
-    return "BTreeMap<" + to_rust_type(tmap->get_key_type()) + ", " + to_rust_type(tmap->get_val_type()) + ">";
+    return "BTreeMap<" + to_rust_type(tmap->get_key_type()) + ", "
+           + to_rust_type(tmap->get_val_type()) + ">";
   } else if (ttype->is_set()) {
     t_set* tset = (t_set*)ttype;
     return "BTreeSet<" + to_rust_type(tset->get_elem_type()) + ">";
@@ -3080,6 +2943,8 @@
       throw "will not generate protocol::TType for TYPE_VOID";
     case t_base_type::TYPE_STRING: // both strings and binary are actually encoded as TType::String
       return "TType::String";
+    case t_base_type::TYPE_UUID:
+      return "TType::Uuid";
     case t_base_type::TYPE_BOOL:
       return "TType::Bool";
     case t_base_type::TYPE_I8:
@@ -3123,6 +2988,8 @@
       } else {
         return "Some(\"\".to_owned())";
       }
+    case t_base_type::TYPE_UUID:
+      return "Some(uuid::Uuid::nil())";
     case t_base_type::TYPE_BOOL:
       return "Some(false)";
     case t_base_type::TYPE_I8:
@@ -3172,7 +3039,8 @@
   return req == t_field::T_OPTIONAL || req == t_field::T_OPT_IN_REQ_OUT;
 }
 
-t_field::e_req t_rs_generator::actual_field_req(t_field* tfield, t_rs_generator::e_struct_type struct_type) {
+t_field::e_req t_rs_generator::actual_field_req(t_field* tfield,
+                                                t_rs_generator::e_struct_type struct_type) {
   return struct_type == t_rs_generator::T_ARGS ? t_field::T_REQUIRED : tfield->get_req();
 }
 
@@ -3197,7 +3065,7 @@
 }
 
 string t_rs_generator::visibility_qualifier(t_rs_generator::e_struct_type struct_type) {
-  switch(struct_type) {
+  switch (struct_type) {
   case t_rs_generator::T_ARGS:
   case t_rs_generator::T_RESULT:
     return "";
@@ -3286,11 +3154,11 @@
   return rust_camel_case(tservice->get_name()) + "SyncProcessor";
 }
 
-string t_rs_generator::rust_sync_processor_impl_name(t_service *tservice) {
+string t_rs_generator::rust_sync_processor_impl_name(t_service* tservice) {
   return "T" + rust_camel_case(tservice->get_name()) + "ProcessFunctions";
 }
 
-string t_rs_generator::rust_enum_variant_name(const string &name) {
+string t_rs_generator::rust_enum_variant_name(const string& name) {
   bool all_uppercase = true;
 
   for (char i : name) {
@@ -3341,17 +3209,19 @@
 }
 
 string t_rs_generator::rust_safe_field_id(int32_t id) {
-    string id_str = std::to_string(abs(id));
-    if (id >= 0) {
-        return id_str;
-    } else {
-        string str("neg");
-        str += id_str;
-        return str;
-    }
+  string id_str = std::to_string(abs(id));
+  if (id >= 0) {
+    return id_str;
+  } else {
+    string str("neg");
+    str += id_str;
+    return str;
+  }
 }
 
-void t_rs_generator::string_replace(string& target, const string& search_string, const string& replace_string) {
+void t_rs_generator::string_replace(string& target,
+                                    const string& search_string,
+                                    const string& replace_string) {
   if (target.empty()) {
     return;
   }
@@ -3371,8 +3241,4 @@
   return "Rust";
 }
 
-
-THRIFT_REGISTER_GENERATOR(
-  rs,
-  "Rust",
-  "\n") // no Rust-generator-specific options
+THRIFT_REGISTER_GENERATOR(rs, "Rust", "\n") // no Rust-generator-specific options
diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml
index 38c277d..a6e8533 100644
--- a/lib/rs/Cargo.toml
+++ b/lib/rs/Cargo.toml
@@ -15,6 +15,7 @@
 [dependencies]
 byteorder = "1.3"
 integer-encoding = "3.0.3"
+uuid = "1"
 log = {version = "0.4", optional = true}
 ordered-float = "3.0"
 threadpool = {version = "1.7", optional = true}
@@ -22,3 +23,6 @@
 [features]
 default = ["server"]
 server = ["threadpool", "log"]
+
+[dev-dependencies]
+uuid = { version = "*", features = ["v4"] }
diff --git a/lib/rs/src/errors.rs b/lib/rs/src/errors.rs
index fc26330..3cd77e5 100644
--- a/lib/rs/src/errors.rs
+++ b/lib/rs/src/errors.rs
@@ -441,6 +441,15 @@
     }
 }
 
+impl From<uuid::Error> for Error {
+    fn from(err: uuid::Error) -> Self {
+        Error::Protocol(ProtocolError {
+            kind: ProtocolErrorKind::InvalidData,
+            message: err.to_string(), // FIXME: use fmt::Error's debug string
+        })
+    }
+}
+
 impl From<string::FromUtf8Error> for Error {
     fn from(err: string::FromUtf8Error) -> Self {
         Error::Protocol(ProtocolError {
diff --git a/lib/rs/src/protocol/binary.rs b/lib/rs/src/protocol/binary.rs
index 9f8af43..5da8018 100644
--- a/lib/rs/src/protocol/binary.rs
+++ b/lib/rs/src/protocol/binary.rs
@@ -190,6 +190,14 @@
         self.transport.read_f64::<BigEndian>().map_err(From::from)
     }
 
+    fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+        let mut buf = [0u8; 16];
+        self.transport
+            .read_exact(&mut buf)
+            .map(|_| uuid::Uuid::from_bytes(buf))
+            .map_err(From::from)
+    }
+
     fn read_string(&mut self) -> crate::Result<String> {
         let bytes = self.read_bytes()?;
         String::from_utf8(bytes).map_err(From::from)
@@ -389,6 +397,12 @@
         self.write_bytes(s.as_bytes())
     }
 
+    fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+        self.transport
+            .write_all(uuid.as_bytes())
+            .map_err(From::from)
+    }
+
     fn write_list_begin(&mut self, identifier: &TListIdentifier) -> crate::Result<()> {
         self.write_byte(field_type_to_u8(identifier.element_type))?;
         self.write_i32(identifier.size)
@@ -470,8 +484,7 @@
         TType::Map => 0x0D,
         TType::Set => 0x0E,
         TType::List => 0x0F,
-        TType::Utf8 => 0x10,
-        TType::Utf16 => 0x11,
+        TType::Uuid => 0x10,
     }
 }
 
@@ -490,8 +503,7 @@
         0x0D => Ok(TType::Map),
         0x0E => Ok(TType::Set),
         0x0F => Ok(TType::List),
-        0x10 => Ok(TType::Utf8),
-        0x11 => Ok(TType::Utf16),
+        0x10 => Ok(TType::Uuid),
         unkn => Err(crate::Error::Protocol(ProtocolError {
             kind: ProtocolErrorKind::InvalidData,
             message: format!("cannot convert {} to TType", unkn),
@@ -886,6 +898,25 @@
     }
 
     #[test]
+    fn must_write_uuid() {
+        let (_, mut o_prot) = test_objects(true);
+        let uuid = uuid::Uuid::new_v4();
+        assert!(o_prot.write_uuid(&uuid).is_ok());
+        let buf = o_prot.transport.write_bytes();
+        assert_eq!(&buf, uuid.as_bytes());
+    }
+
+    #[test]
+    fn must_round_trip_uuid() {
+        let (mut i_prot, mut o_prot) = test_objects(true);
+        let uuid = uuid::uuid!("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4");
+        assert!(o_prot.write_uuid(&uuid).is_ok());
+        copy_write_buffer_to_read_buffer!(o_prot);
+        let received_uuid = assert_success!(i_prot.read_uuid());
+        assert_eq!(&received_uuid, &uuid);
+    }
+
+    #[test]
     fn must_round_trip_bytes() {
         let (mut i_prot, mut o_prot) = test_objects(true);
 
diff --git a/lib/rs/src/protocol/compact.rs b/lib/rs/src/protocol/compact.rs
index 87cfbfc..a1aa253 100644
--- a/lib/rs/src/protocol/compact.rs
+++ b/lib/rs/src/protocol/compact.rs
@@ -252,6 +252,10 @@
             .map_err(From::from)
     }
 
+    fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+        uuid::Uuid::from_slice(&self.read_bytes()?).map_err(From::from)
+    }
+
     fn read_string(&mut self) -> crate::Result<String> {
         let bytes = self.read_bytes()?;
         String::from_utf8(bytes).map_err(From::from)
@@ -538,6 +542,10 @@
             .map_err(From::from)
     }
 
+    fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+        self.write_bytes(uuid.as_bytes())
+    }
+
     fn write_string(&mut self, s: &str) -> crate::Result<()> {
         self.write_bytes(s.as_bytes())
     }
@@ -637,6 +645,7 @@
         TType::Set => 0x0A,
         TType::Map => 0x0B,
         TType::Struct => 0x0C,
+        TType::Uuid => 0x0D,
         _ => panic!("should not have attempted to convert {} to u8", field_type),
     }
 }
@@ -661,6 +670,7 @@
         0x0A => Ok(TType::Set),
         0x0B => Ok(TType::Map),
         0x0C => Ok(TType::Struct),
+        0x0D => Ok(TType::Uuid),
         unkn => Err(crate::Error::Protocol(crate::ProtocolError {
             kind: crate::ProtocolErrorKind::InvalidData,
             message: format!("cannot convert {} into TType", unkn),
diff --git a/lib/rs/src/protocol/mod.rs b/lib/rs/src/protocol/mod.rs
index 019f717..0e47795 100644
--- a/lib/rs/src/protocol/mod.rs
+++ b/lib/rs/src/protocol/mod.rs
@@ -171,6 +171,8 @@
     fn read_i64(&mut self) -> crate::Result<i64>;
     /// Read a 64-bit float.
     fn read_double(&mut self) -> crate::Result<f64>;
+    /// Read a UUID.
+    fn read_uuid(&mut self) -> crate::Result<uuid::Uuid>;
     /// Read a fixed-length string (not null terminated).
     fn read_string(&mut self) -> crate::Result<String>;
     /// Read the beginning of a list.
@@ -323,6 +325,8 @@
     fn write_i64(&mut self, i: i64) -> crate::Result<()>;
     /// Write a 64-bit float.
     fn write_double(&mut self, d: f64) -> crate::Result<()>;
+    /// Write a UUID
+    fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()>;
     /// Write a fixed-length string.
     fn write_string(&mut self, s: &str) -> crate::Result<()>;
     /// Write the beginning of a list.
@@ -405,6 +409,10 @@
         (**self).read_double()
     }
 
+    fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+        (**self).read_uuid()
+    }
+
     fn read_string(&mut self) -> crate::Result<String> {
         (**self).read_string()
     }
@@ -498,6 +506,10 @@
         (**self).write_double(d)
     }
 
+    fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+        (**self).write_uuid(uuid)
+    }
+
     fn write_string(&mut self, s: &str) -> crate::Result<()> {
         (**self).write_string(s)
     }
@@ -823,8 +835,8 @@
     List,
     /// UTF-8 string.
     Utf8,
-    /// UTF-16 string. *Unsupported*.
-    Utf16,
+    /// Uuid.
+    Uuid,
 }
 
 impl Display for TType {
@@ -845,7 +857,7 @@
             TType::Set => write!(f, "set"),
             TType::List => write!(f, "list"),
             TType::Utf8 => write!(f, "UTF8"),
-            TType::Utf16 => write!(f, "UTF16"),
+            TType::Uuid => write!(f, "UUID"),
         }
     }
 }
diff --git a/lib/rs/src/protocol/multiplexed.rs b/lib/rs/src/protocol/multiplexed.rs
index 697b7e6..48d4989 100644
--- a/lib/rs/src/protocol/multiplexed.rs
+++ b/lib/rs/src/protocol/multiplexed.rs
@@ -152,6 +152,10 @@
         self.inner.write_string(s)
     }
 
+    fn write_uuid(&mut self, uuid: &uuid::Uuid) -> crate::Result<()> {
+        self.inner.write_uuid(uuid)
+    }
+
     fn write_list_begin(&mut self, identifier: &TListIdentifier) -> crate::Result<()> {
         self.inner.write_list_begin(identifier)
     }
diff --git a/lib/rs/src/protocol/stored.rs b/lib/rs/src/protocol/stored.rs
index 179ae07..f4bdfb1 100644
--- a/lib/rs/src/protocol/stored.rs
+++ b/lib/rs/src/protocol/stored.rs
@@ -158,6 +158,10 @@
         self.inner.read_double()
     }
 
+    fn read_uuid(&mut self) -> crate::Result<uuid::Uuid> {
+        self.inner.read_uuid()
+    }
+
     fn read_string(&mut self) -> crate::Result<String> {
         self.inner.read_string()
     }
diff --git a/lib/rs/test/Cargo.toml b/lib/rs/test/Cargo.toml
index a1c6836..4c64f38 100644
--- a/lib/rs/test/Cargo.toml
+++ b/lib/rs/test/Cargo.toml
@@ -10,6 +10,7 @@
 clap = "~2.33"
 bitflags = "=1.2"
 log = "0.4"
+uuid = "1"
 
 [dependencies.thrift]
 path = "../"
diff --git a/lib/rs/test/thrifts/Base_One.thrift b/lib/rs/test/thrifts/Base_One.thrift
index c5fa6c2..f1214c9 100644
--- a/lib/rs/test/thrifts/Base_One.thrift
+++ b/lib/rs/test/thrifts/Base_One.thrift
@@ -74,6 +74,7 @@
   1: string recipeName
   2: string cuisine
   3: i8 page
+  4: uuid recipeId
 }
 
 union CookingTools {
diff --git a/test/rs/Cargo.toml b/test/rs/Cargo.toml
index b039fff..da53b96 100644
--- a/test/rs/Cargo.toml
+++ b/test/rs/Cargo.toml
@@ -11,7 +11,7 @@
 bitflags = "=1.2"
 env_logger = "0.8"
 log = "0.4"
+uuid = "1"
 
 [dependencies.thrift]
 path = "../../lib/rs"
-
diff --git a/test/rs/Makefile.am b/test/rs/Makefile.am
index 103f80c..78db5ee 100644
--- a/test/rs/Makefile.am
+++ b/test/rs/Makefile.am
@@ -17,8 +17,8 @@
 # under the License.
 #
 
-stubs: ../v0.16/ThriftTest.thrift
-	$(THRIFT) -I ./thrifts -out src --gen rs ../v0.16/ThriftTest.thrift
+stubs: ../ThriftTest.thrift
+	$(THRIFT) -I ./thrifts -out src --gen rs ../ThriftTest.thrift
 
 precross: stubs
 	$(CARGO) build
diff --git a/test/rs/src/bin/test_client.rs b/test/rs/src/bin/test_client.rs
index a44bac3..fd3a185 100644
--- a/test/rs/src/bin/test_client.rs
+++ b/test/rs/src/bin/test_client.rs
@@ -231,6 +231,12 @@
         "thing".to_owned(),
     )?;
 
+    info!("testUuid");
+    verify_expected_result(
+        thrift_test_client.test_uuid(uuid::uuid!("00010203-0405-0607-0809-0a0b0c0d0e0f")),
+        uuid::uuid!("00010203-0405-0607-0809-0a0b0c0d0e0f"),
+    )?;
+
     info!("testBool");
     verify_expected_result(thrift_test_client.test_bool(true), true)?;
 
diff --git a/test/rs/src/bin/test_server.rs b/test/rs/src/bin/test_server.rs
index 92a4bcc..3e622d5 100644
--- a/test/rs/src/bin/test_server.rs
+++ b/test/rs/src/bin/test_server.rs
@@ -174,6 +174,11 @@
         Ok(thing)
     }
 
+    fn handle_test_uuid(&self, thing: uuid::Uuid) -> thrift::Result<uuid::Uuid> {
+        info!("testUUID({})", &thing);
+        Ok(thing)
+    }
+
     fn handle_test_bool(&self, thing: bool) -> thrift::Result<bool> {
         info!("testBool({})", thing);
         Ok(thing)