blob: 8d9ac862f3a1b8ad4c0fe776f92577b57704edb7 [file] [log] [blame]
// Copyright 2018 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.
#![feature(async_await, await_macro)]
use failure::{Error, ResultExt};
use fidl::endpoints2::{ServiceMarker, RequestStream};
use fidl_fidl_examples_echo::{EchoMarker, EchoRequest, EchoRequestStream};
use fuchsia_app::server::ServicesServer;
use fuchsia_async as fasync;
use futures::prelude::*;
use std::env;
fn spawn_echo_server(chan: fasync::Channel, quiet: bool) {
fasync::spawn(async move {
let mut stream = EchoRequestStream::from_channel(chan);
while let Some(EchoRequest::EchoString { value, responder }) =
await!(stream.try_next()).context("error running echo server")?
{
if !quiet {
println!("Received echo request for string {:?}", value);
}
responder.send(value.as_ref().map(|s| &**s)).context("error sending response")?;
println!("echo response sent successfully");
}
Ok(())
}.unwrap_or_else(|e: failure::Error| eprintln!("{:?}", e)));
}
fn main() -> Result<(), Error> {
let mut executor = fasync::Executor::new().context("Error creating executor")?;
let quiet = env::args().any(|arg| arg == "-q");
let fut = ServicesServer::new()
.add_service((EchoMarker::NAME, move |chan| spawn_echo_server(chan, quiet)))
.start()
.context("Error starting echo services server")?;
executor.run_singlethreaded(fut).context("failed to execute echo future")?;
Ok(())
}