blob: 9c636bffede446a9738e69ebfe61a4adcfb57d56 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
crate::{echo_capability::EchoCapability, injectors::ProtocolInjector},
anyhow::Error,
async_trait::async_trait,
fidl_fuchsia_test_echofactory as fechofactory, fuchsia_async as fasync,
futures::StreamExt,
std::sync::Arc,
};
/// Capability that serves the Echofactory FIDL protocol.
#[derive(Clone)]
pub struct EchoFactoryCapability;
impl EchoFactoryCapability {
pub fn new() -> Arc<Self> {
Arc::new(Self {})
}
pub fn serve_async(self: Arc<Self>, request_stream: fechofactory::EchoFactoryRequestStream) {
fasync::Task::spawn(async move {
self.serve(request_stream).await.expect("EchoFactoryCapability injector failed");
})
.detach();
}
}
#[async_trait]
impl ProtocolInjector for EchoFactoryCapability {
type Marker = fechofactory::EchoFactoryMarker;
async fn serve(
self: Arc<Self>,
mut request_stream: fechofactory::EchoFactoryRequestStream,
) -> Result<(), Error> {
while let Some(Ok(fechofactory::EchoFactoryRequest::RequestEchoProtocol {
server_end,
responder,
})) = request_stream.next().await
{
let (capability, mut echo_rx) = EchoCapability::new();
fasync::Task::spawn(async move {
let stream = server_end.into_stream().expect("could not convert into stream");
capability.serve(stream).await.expect("EchoCapability injector failed");
})
.detach();
fasync::Task::spawn(async move {
while let Some(echo) = echo_rx.next().await {
echo.resume();
}
})
.detach();
responder.send()?;
}
Ok(())
}
}