blob: cdfe3e9065ff224d14741ab5bc72f36587d63504 [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.
use {
failure::{Error, ResultExt},
fidl_fuchsia_netemul_bus::{BusManagerMarker, BusMarker, Event},
fuchsia_app::client,
futures::TryStreamExt,
};
const BUS_NAME: &str = "evt_bus";
pub const SERVER_READY: i32 = 1;
pub struct BusConnection {
bus: fidl_fuchsia_netemul_bus::BusProxy,
}
impl BusConnection {
pub fn new(client: &str) -> Result<BusConnection, Error> {
let busm =
client::connect_to_service::<BusManagerMarker>().context("BusManager not available")?;
let (bus, busch) = fidl::endpoints::create_proxy::<BusMarker>()?;
busm.subscribe(BUS_NAME, client, busch)?;
Ok(BusConnection { bus })
}
pub fn publish_code(&self, code: i32) -> Result<(), Error> {
self.bus.publish(&mut Event {
code: code,
message: None,
arguments: None,
})?;
Ok(())
}
pub async fn wait_for_event(&self, code: i32) -> Result<(), Error> {
let mut stream = self
.bus
.take_event_stream()
.try_filter_map(|event| match event {
fidl_fuchsia_netemul_bus::BusEvent::OnBusData { data } => {
if data.code == code {
futures::future::ok(Some(()))
} else {
futures::future::ok(None)
}
}
_ => futures::future::ok(None),
});
await!(stream.try_next())?;
Ok(())
}
}