1
0
Fork 0
forked from wry/wry
wry/src/it/test_object.rs
2022-05-03 17:31:44 +02:00

54 lines
1.8 KiB
Rust

use {
crate::{
it::{test_error::TestError, test_transport::TestTransport},
object::{Interface, ObjectId},
utils::buffd::MsgParser,
},
std::rc::Rc,
};
macro_rules! test_object {
($oname:ident, $ifname:ident; $($code:ident => $f:ident,)*) => {
impl crate::it::test_object::TestObjectBase for $oname {
fn id(&self) -> crate::object::ObjectId {
self.id.into()
}
#[allow(unused_variables, unreachable_code)]
fn handle_request(
self: std::rc::Rc<Self>,
request: u32,
parser: crate::utils::buffd::MsgParser<'_, '_>,
) -> Result<(), crate::it::test_error::TestError> {
use crate::it::test_error::TestErrorExt;
let res: Result<(), crate::it::test_error::TestError> = match request {
$(
$code => $oname::$f(&self, parser).with_context(|| format!("While handling a `{}` event", stringify!($f))),
)*
_ => Err(crate::it::test_error::TestError::new(format!("Unknown event {}", request))),
};
res.with_context(|| format!("In object {} of type `{}`", self.id(), self.interface().name()))
}
fn interface(&self) -> crate::object::Interface {
crate::wire::$ifname
}
}
};
}
pub trait TestObjectBase: 'static {
fn id(&self) -> ObjectId;
fn handle_request(
self: Rc<Self>,
request: u32,
parser: MsgParser<'_, '_>,
) -> Result<(), TestError>;
fn interface(&self) -> Interface;
}
pub trait TestObject: TestObjectBase {
fn on_remove(&self, transport: &TestTransport) {
let _ = transport;
}
}