[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.