use crate::proxy;
use super::{Error, Info, InterfaceDescription, OwnedError, OwnedInfo};
#[proxy(
interface = "org.varlink.service",
crate = "crate",
chain_name = "Chain"
)]
#[cfg(feature = "std")]
pub trait Proxy {
async fn get_info(&mut self) -> crate::Result<core::result::Result<Info<'_>, Error<'_>>>;
#[zlink(rename = "GetInfo")]
async fn owned_get_info(
&mut self,
) -> crate::Result<core::result::Result<OwnedInfo, OwnedError>>;
async fn get_interface_description(
&mut self,
interface: &str,
) -> crate::Result<core::result::Result<InterfaceDescription<'static>, Error<'_>>>;
#[zlink(rename = "GetInterfaceDescription")]
async fn owned_get_interface_description(
&mut self,
interface: &str,
) -> crate::Result<core::result::Result<InterfaceDescription<'static>, OwnedError>>;
}
#[cfg(test)]
mod tests {
use super::{super::OwnedReply, *};
use crate::{Connection, test_utils::mock_socket::MockSocket};
use futures_util::{pin_mut, stream::StreamExt};
#[tokio::test]
async fn chain_api_creation() -> crate::Result<()> {
let responses = [
r#"{"parameters":{"vendor":"Test","product":"TestProduct","version":"1.0","url":"https://test.com","interfaces":["org.varlink.service"]}}"#,
r#"{"parameters":{"description":"interface org.varlink.service {}"}}"#,
];
let socket = MockSocket::with_responses(&responses);
let mut conn = Connection::new(socket);
let _chain1 = conn.chain_owned_get_info()?;
let _chain2 = conn.chain_owned_get_interface_description("org.varlink.service")?;
Ok(())
}
#[tokio::test]
async fn chain_extension_methods() -> crate::Result<()> {
let responses = [
r#"{"parameters":{"vendor":"Test","product":"TestProduct","version":"1.0","url":"https://test.com","interfaces":["org.varlink.service"]}}"#,
r#"{"parameters":{"description":"interface org.varlink.service {}"}}"#,
r#"{"parameters":{"vendor":"Test","product":"TestProduct","version":"1.0","url":"https://test.com","interfaces":["org.varlink.service"]}}"#,
];
let socket = MockSocket::with_responses(&responses);
let mut conn = Connection::new(socket);
let chained = conn
.chain_owned_get_info()?
.owned_get_interface_description("org.varlink.service")?
.owned_get_info()?;
let replies = chained.send::<OwnedReply, OwnedError>().await?;
pin_mut!(replies);
let (first_reply, _fds) = replies.next().await.unwrap()?;
let first_reply = first_reply.unwrap();
match first_reply.into_parameters().unwrap() {
OwnedReply::Info(info) => {
assert_eq!(info.vendor, "Test");
assert_eq!(info.product, "TestProduct");
assert_eq!(info.version, "1.0");
assert_eq!(info.url, "https://test.com");
assert_eq!(info.interfaces, ["org.varlink.service"]);
}
_ => panic!("Expected Info reply"),
}
let (second_reply, _fds) = replies.next().await.unwrap()?;
let second_reply = second_reply.unwrap();
match second_reply.into_parameters().unwrap() {
OwnedReply::InterfaceDescription(desc) => {
assert_eq!(desc.as_raw().unwrap(), "interface org.varlink.service {}");
}
_ => panic!("Expected InterfaceDescription reply"),
}
let (third_reply, _fds) = replies.next().await.unwrap()?;
let third_reply = third_reply.unwrap();
match third_reply.into_parameters().unwrap() {
OwnedReply::Info(info) => {
assert_eq!(info.vendor, "Test");
}
_ => panic!("Expected Info reply"),
}
assert!(replies.next().await.is_none());
Ok(())
}
}