[rust][fidl] Add a method for casting request streams

Test: compiled
Change-Id: If7042b676672063929ff795ef39f354e3317ea12
diff --git a/go/src/fidl/compiler/backend/rust/templates/interface.tmpl.go b/go/src/fidl/compiler/backend/rust/templates/interface.tmpl.go
index 16b78e0..212e700 100644
--- a/go/src/fidl/compiler/backend/rust/templates/interface.tmpl.go
+++ b/go/src/fidl/compiler/backend/rust/templates/interface.tmpl.go
@@ -496,7 +496,7 @@
 }
 
 impl fidl::endpoints::RequestStream for {{ $interface.Name }}RequestStream {
-        /// Consume a channel to make a {{ $interface.Name }}RequestStream
+	/// Consume a channel to make a {{ $interface.Name }}RequestStream
 	fn from_channel(channel: ::fuchsia_async::Channel) -> Self {
 		Self {
 			inner: ::std::sync::Arc::new(fidl::ServeInner::new(channel)),
@@ -504,13 +504,21 @@
 		}
 	}
 
-        /// ControlHandle for the remote connection
+   /// ControlHandle for the remote connection
 	type ControlHandle = {{ $interface.Name }}ControlHandle;
 
-        /// Get a ControlHandle for {{ $interface.Name }}
+   /// ControlHandle for the remote connection
 	fn control_handle(&self) -> Self::ControlHandle {
 		{{ $interface.Name }}ControlHandle { inner: self.inner.clone() }
 	}
+
+	fn into_inner(self) -> (::std::sync::Arc<fidl::ServeInner>, Option<zx::MessageBuf>) {
+		(self.inner, self.msg_buf)
+	}
+
+	fn from_inner(inner: ::std::sync::Arc<fidl::ServeInner>, msg_buf: Option<zx::MessageBuf>) -> Self {
+		Self { inner, msg_buf }
+	}
 }
 
 impl Stream for {{ $interface.Name }}RequestStream {
diff --git a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json
index f4916be..50703d5 100644
--- a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json
+++ b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json
@@ -36,8 +36,8 @@
       ],
       "methods": [
         {
-          "ordinal": 1,
-          "generated_ordinal": 1061382220,
+          "ordinal": 1061382220,
+          "generated_ordinal": 1,
           "name": "Method",
           "has_request": true,
           "maybe_attributes": [
diff --git a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.cc.golden b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.cc.golden
index 807b260..fea94c6 100644
--- a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.cc.golden
+++ b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.cc.golden
@@ -8,8 +8,8 @@
 
 namespace {
   
-constexpr uint32_t kInterface_Method_GenOrdinal = 1061382220u;
-constexpr uint32_t kInterface_Method_Ordinal = 1u;
+constexpr uint32_t kInterface_Method_GenOrdinal = 1u;
+constexpr uint32_t kInterface_Method_Ordinal = 1061382220u;
 extern "C" const fidl_type_t test_name_InterfaceMethodRequestTable;
 
 }  // namespace
diff --git a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.go.golden b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.go.golden
index febd60e..8e0eca2 100644
--- a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.go.golden
+++ b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.go.golden
@@ -121,8 +121,8 @@
 	u.FieldPresent = false
 }
 const (
-	InterfaceMethodOrdinal uint32 = 1
-	InterfaceMethodGenOrdinal uint32 = 1061382220
+	InterfaceMethodOrdinal uint32 = 1061382220
+	InterfaceMethodGenOrdinal uint32 = 1
 )
 
 type InterfaceMethodRequest struct {
diff --git a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.llcpp.cpp.golden b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.llcpp.cpp.golden
index 05388bb..06b03e6 100644
--- a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.llcpp.cpp.golden
+++ b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.llcpp.cpp.golden
@@ -8,7 +8,7 @@
 namespace {
 
 [[maybe_unused]]
-constexpr uint32_t kInterface_Method_Ordinal = 1u;
+constexpr uint32_t kInterface_Method_Ordinal = 1061382220u;
 extern "C" const fidl_type_t test_name_InterfaceMethodRequestTable;
 
 }  // namespace
diff --git a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.rs.golden b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.rs.golden
index f8834d2..b016e1a 100644
--- a/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.rs.golden
+++ b/go/src/fidl/compiler/backend/typestest/doc_comments.fidl.json.rs.golden
@@ -107,7 +107,7 @@
 	///
 	/// method comment #3
 	pub fn method(&mut self,) -> Result<(), fidl::Error> {self.client.send(&mut (),
-				1,
+				1061382220,
 			)}
 }
 
@@ -165,7 +165,7 @@
 impl InterfaceProxyInterface for InterfaceProxy {
 	fn method(&self,
 	)-> Result<(), fidl::Error> {
-		self.client.send(&mut (), 1)
+		self.client.send(&mut (), 1061382220)
 	}}
 
 pub struct InterfaceEventStream {
@@ -316,7 +316,7 @@
 			let (header, body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
 
 			match header.ordinal {
-					1 | 1061382220 => {
+					1061382220 | 1 => {
 						let mut req: () = fidl::encoding::Decodable::new_empty();
 						fidl::encoding::Decoder::decode_into(body_bytes, handles, &mut req)?;
 						let control_handle = InterfaceControlHandle {
@@ -352,7 +352,7 @@
 }
 
 impl fidl::endpoints::RequestStream for InterfaceRequestStream {
-        /// Consume a channel to make a InterfaceRequestStream
+	/// Consume a channel to make a InterfaceRequestStream
 	fn from_channel(channel: ::fuchsia_async::Channel) -> Self {
 		Self {
 			inner: ::std::sync::Arc::new(fidl::ServeInner::new(channel)),
@@ -360,13 +360,21 @@
 		}
 	}
 
-        /// ControlHandle for the remote connection
+   /// ControlHandle for the remote connection
 	type ControlHandle = InterfaceControlHandle;
 
-        /// Get a ControlHandle for Interface
+   /// ControlHandle for the remote connection
 	fn control_handle(&self) -> Self::ControlHandle {
 		InterfaceControlHandle { inner: self.inner.clone() }
 	}
+
+	fn into_inner(self) -> (::std::sync::Arc<fidl::ServeInner>, Option<zx::MessageBuf>) {
+		(self.inner, self.msg_buf)
+	}
+
+	fn from_inner(inner: ::std::sync::Arc<fidl::ServeInner>, msg_buf: Option<zx::MessageBuf>) -> Self {
+		Self { inner, msg_buf }
+	}
 }
 
 impl Stream for InterfaceRequestStream {
@@ -399,7 +407,7 @@
 			let (header, body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
 
 			match header.ordinal {
-				1 | 1061382220 => {
+				1061382220 | 1 => {
 					let mut req: () = fidl::encoding::Decodable::new_empty();
 					fidl::encoding::Decoder::decode_into(body_bytes, handles, &mut req)?;
 					let control_handle = InterfaceControlHandle {
diff --git a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json
index c254758..1018e9b 100644
--- a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json
+++ b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json
@@ -9,8 +9,8 @@
       "name": "test.name/SwitchingOrdinals",
       "methods": [
         {
-          "ordinal": 5,
-          "generated_ordinal": 2005164903,
+          "ordinal": 2005164903,
+          "generated_ordinal": 5,
           "name": "OrdinalFive",
           "has_request": true,
           "maybe_request": [],
@@ -29,8 +29,8 @@
           "has_response": false
         },
         {
-          "ordinal": 15,
-          "generated_ordinal": 1467258273,
+          "ordinal": 1467258273,
+          "generated_ordinal": 15,
           "name": "EventOrdinalFifteen",
           "has_request": false,
           "has_response": true,
diff --git a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.cc.golden b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.cc.golden
index 97c11b7..3b52477 100644
--- a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.cc.golden
+++ b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.cc.golden
@@ -8,15 +8,15 @@
 
 namespace {
   
-constexpr uint32_t kSwitchingOrdinals_OrdinalFive_GenOrdinal = 2005164903u;
-constexpr uint32_t kSwitchingOrdinals_OrdinalFive_Ordinal = 5u;
+constexpr uint32_t kSwitchingOrdinals_OrdinalFive_GenOrdinal = 5u;
+constexpr uint32_t kSwitchingOrdinals_OrdinalFive_Ordinal = 2005164903u;
 extern "C" const fidl_type_t test_name_SwitchingOrdinalsOrdinalFiveRequestTable;
   
 constexpr uint32_t kSwitchingOrdinals_OnlyGeneratedOrdinal_Ordinal = 667506719u;
 extern "C" const fidl_type_t test_name_SwitchingOrdinalsOnlyGeneratedOrdinalRequestTable;
   
-constexpr uint32_t kSwitchingOrdinals_EventOrdinalFifteen_GenOrdinal = 1467258273u;
-constexpr uint32_t kSwitchingOrdinals_EventOrdinalFifteen_Ordinal = 15u;
+constexpr uint32_t kSwitchingOrdinals_EventOrdinalFifteen_GenOrdinal = 15u;
+constexpr uint32_t kSwitchingOrdinals_EventOrdinalFifteen_Ordinal = 1467258273u;
 extern "C" const fidl_type_t test_name_SwitchingOrdinalsEventOrdinalFifteenEventTable;
   
 constexpr uint32_t kSwitchingOrdinals_EventOnlyGeneratedOrdinal_Ordinal = 2146190926u;
diff --git a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.go.golden b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.go.golden
index 80a1f2c..d912f2b 100644
--- a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.go.golden
+++ b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.go.golden
@@ -12,12 +12,12 @@
 
 
 const (
-	SwitchingOrdinalsOrdinalFiveOrdinal uint32 = 5
-	SwitchingOrdinalsOrdinalFiveGenOrdinal uint32 = 2005164903
+	SwitchingOrdinalsOrdinalFiveOrdinal uint32 = 2005164903
+	SwitchingOrdinalsOrdinalFiveGenOrdinal uint32 = 5
 	SwitchingOrdinalsOnlyGeneratedOrdinalOrdinal uint32 = 667506719
 	SwitchingOrdinalsOnlyGeneratedOrdinalGenOrdinal uint32 = 667506719
-	SwitchingOrdinalsEventOrdinalFifteenOrdinal uint32 = 15
-	SwitchingOrdinalsEventOrdinalFifteenGenOrdinal uint32 = 1467258273
+	SwitchingOrdinalsEventOrdinalFifteenOrdinal uint32 = 1467258273
+	SwitchingOrdinalsEventOrdinalFifteenGenOrdinal uint32 = 15
 	SwitchingOrdinalsEventOnlyGeneratedOrdinalOrdinal uint32 = 2146190926
 	SwitchingOrdinalsEventOnlyGeneratedOrdinalGenOrdinal uint32 = 2146190926
 )
diff --git a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.llcpp.cpp.golden b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.llcpp.cpp.golden
index cbe5186..a75e0e3 100644
--- a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.llcpp.cpp.golden
+++ b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.llcpp.cpp.golden
@@ -8,13 +8,13 @@
 namespace {
 
 [[maybe_unused]]
-constexpr uint32_t kSwitchingOrdinals_OrdinalFive_Ordinal = 5u;
+constexpr uint32_t kSwitchingOrdinals_OrdinalFive_Ordinal = 2005164903u;
 extern "C" const fidl_type_t test_name_SwitchingOrdinalsOrdinalFiveRequestTable;
 [[maybe_unused]]
 constexpr uint32_t kSwitchingOrdinals_OnlyGeneratedOrdinal_Ordinal = 667506719u;
 extern "C" const fidl_type_t test_name_SwitchingOrdinalsOnlyGeneratedOrdinalRequestTable;
 [[maybe_unused]]
-constexpr uint32_t kSwitchingOrdinals_EventOrdinalFifteen_Ordinal = 15u;
+constexpr uint32_t kSwitchingOrdinals_EventOrdinalFifteen_Ordinal = 1467258273u;
 extern "C" const fidl_type_t test_name_SwitchingOrdinalsEventOrdinalFifteenEventTable;
 [[maybe_unused]]
 constexpr uint32_t kSwitchingOrdinals_EventOnlyGeneratedOrdinal_Ordinal = 2146190926u;
diff --git a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.rs.golden b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.rs.golden
index 41c591e..0003a18 100644
--- a/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.rs.golden
+++ b/go/src/fidl/compiler/backend/typestest/ordinal_switch.fidl.json.rs.golden
@@ -47,7 +47,7 @@
 		self.client.into_channel()
 	}
 	pub fn ordinal_five(&mut self,) -> Result<(), fidl::Error> {self.client.send(&mut (),
-				5,
+				2005164903,
 			)}
 	pub fn only_generated_ordinal(&mut self,) -> Result<(), fidl::Error> {self.client.send(&mut (),
 				667506719,
@@ -110,7 +110,7 @@
 impl SwitchingOrdinalsProxyInterface for SwitchingOrdinalsProxy {
 	fn ordinal_five(&self,
 	)-> Result<(), fidl::Error> {
-		self.client.send(&mut (), 5)
+		self.client.send(&mut (), 2005164903)
 	}
 	fn only_generated_ordinal(&self,
 	)-> Result<(), fidl::Error> {
@@ -144,7 +144,7 @@
 		let (bytes, handles) = buf.split_mut();
 		let (tx_header, body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
 		futures::Poll::Ready(Some(match tx_header.ordinal {
-			15 | 1467258273 => {
+			1467258273 | 15 => {
 				let mut out_tuple: () = fidl::encoding::Decodable::new_empty();
 				fidl::encoding::Decoder::decode_into(body_bytes, handles, &mut out_tuple)?;
 				Ok((
@@ -298,7 +298,7 @@
 			let (header, body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
 
 			match header.ordinal {
-					5 | 2005164903 => {
+					2005164903 | 5 => {
 						let mut req: () = fidl::encoding::Decodable::new_empty();
 						fidl::encoding::Decoder::decode_into(body_bytes, handles, &mut req)?;
 						let control_handle = SwitchingOrdinalsControlHandle {
@@ -344,7 +344,7 @@
 }
 
 impl fidl::endpoints::RequestStream for SwitchingOrdinalsRequestStream {
-        /// Consume a channel to make a SwitchingOrdinalsRequestStream
+	/// Consume a channel to make a SwitchingOrdinalsRequestStream
 	fn from_channel(channel: ::fuchsia_async::Channel) -> Self {
 		Self {
 			inner: ::std::sync::Arc::new(fidl::ServeInner::new(channel)),
@@ -352,13 +352,21 @@
 		}
 	}
 
-        /// ControlHandle for the remote connection
+   /// ControlHandle for the remote connection
 	type ControlHandle = SwitchingOrdinalsControlHandle;
 
-        /// Get a ControlHandle for SwitchingOrdinals
+   /// ControlHandle for the remote connection
 	fn control_handle(&self) -> Self::ControlHandle {
 		SwitchingOrdinalsControlHandle { inner: self.inner.clone() }
 	}
+
+	fn into_inner(self) -> (::std::sync::Arc<fidl::ServeInner>, Option<zx::MessageBuf>) {
+		(self.inner, self.msg_buf)
+	}
+
+	fn from_inner(inner: ::std::sync::Arc<fidl::ServeInner>, msg_buf: Option<zx::MessageBuf>) -> Self {
+		Self { inner, msg_buf }
+	}
 }
 
 impl Stream for SwitchingOrdinalsRequestStream {
@@ -391,7 +399,7 @@
 			let (header, body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
 
 			match header.ordinal {
-				5 | 2005164903 => {
+				2005164903 | 5 => {
 					let mut req: () = fidl::encoding::Decodable::new_empty();
 					fidl::encoding::Decoder::decode_into(body_bytes, handles, &mut req)?;
 					let control_handle = SwitchingOrdinalsControlHandle {
@@ -525,7 +533,7 @@
 		let header = fidl::encoding::TransactionHeader {
 			tx_id: 0,
 			flags: 0,
-			ordinal: 15,
+			ordinal: 1467258273,
 		};
 
 		let mut response = ();
diff --git a/public/lib/fidl/rust/fidl/src/endpoints.rs b/public/lib/fidl/rust/fidl/src/endpoints.rs
index 12f1da4..4f593a6 100644
--- a/public/lib/fidl/rust/fidl/src/endpoints.rs
+++ b/public/lib/fidl/rust/fidl/src/endpoints.rs
@@ -5,10 +5,11 @@
 //! Wrapper types for the endpoints of a connection.
 
 use {
-    crate::Error,
+    crate::{Error, ServeInner},
     fuchsia_async as fasync,
     fuchsia_zircon as zx,
     std::marker::PhantomData,
+    std::sync::Arc,
 };
 
 /// A marker for a particular FIDL service.
@@ -44,6 +45,18 @@
 
     /// Create a request stream from the given channel.
     fn from_channel(inner: fasync::Channel) -> Self;
+
+    /// Convert this channel into its underlying components.
+    fn into_inner(self) -> (Arc<ServeInner>, Option<zx::MessageBuf>);
+
+    /// Create this channel from its underlying components.
+    fn from_inner(inner: Arc<ServeInner>, msg_buf: Option<zx::MessageBuf>) -> Self;
+
+    /// Convert this FIDL request stream into a request stream of another FIDL protocol.
+    fn cast_stream<T: RequestStream>(self) -> T {
+        let inner = self.into_inner();
+        T::from_inner(inner.0, inner.1)
+    }
 }
 
 /// The `Client` end of a FIDL connection.