1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use {
fidl_fidl_examples_routing_echo as fecho, fuchsia_component::client,
fuchsia_component::server::ServiceFs, futures::prelude::*, tracing::*,
};
enum IncomingRequest {
Echo(fecho::EchoRequestStream),
}
#[fuchsia::main]
async fn main() {
let echo = client::connect_to_protocol_at::<fecho::EchoMarker>("/svc_for_sys").unwrap();
info!("call echo");
let out = echo.echo_string(Some("hello")).await.unwrap();
info!("received echo response");
assert_eq!(out.unwrap(), "hello");
info!("serving echo");
let mut service_fs = ServiceFs::new_local();
service_fs.dir("svc").add_fidl_service(IncomingRequest::Echo);
service_fs.take_and_serve_directory_handle().unwrap();
service_fs
.for_each_concurrent(None, |request: IncomingRequest| async move {
match request {
IncomingRequest::Echo(stream) => handle_echo_request(stream).await,
}
})
.await;
}
async fn handle_echo_request(mut stream: fecho::EchoRequestStream) {
while let Some(event) = stream.try_next().await.unwrap() {
info!("received echo request");
let fecho::EchoRequest::EchoString { value, responder } = event;
responder.send(value.as_ref().map(|s| &**s)).unwrap();
}
}