avahi!() macro

Signed-off-by: Walker Crouse <walker.crouse@coop.co.uk>
This commit is contained in:
Walker Crouse 2020-09-28 14:37:21 -04:00
parent 560d33454d
commit 3316b9a0e3
4 changed files with 89 additions and 81 deletions

View File

@ -1,6 +1,5 @@
//! Rust friendly `AvahiEntryGroup` wrappers/helpers //! Rust friendly `AvahiEntryGroup` wrappers/helpers
use super::avahi_util;
use crate::Result; use crate::Result;
use avahi_sys::{ use avahi_sys::{
avahi_entry_group_add_service, avahi_entry_group_commit, avahi_entry_group_free, avahi_entry_group_add_service, avahi_entry_group_commit, avahi_entry_group_free,
@ -60,7 +59,7 @@ impl ManagedAvahiEntryGroup {
port, port,
}: AddServiceParams, }: AddServiceParams,
) -> Result<()> { ) -> Result<()> {
let err = unsafe { avahi!(
avahi_entry_group_add_service( avahi_entry_group_add_service(
self.0, self.0,
interface, interface,
@ -72,24 +71,11 @@ impl ManagedAvahiEntryGroup {
host, host,
port, port,
ptr::null_mut() as *const c_char, // null terminated txt record list ptr::null_mut() as *const c_char, // null terminated txt record list
) ),
}; "could not register service"
)?;
if err < 0 { avahi!(avahi_entry_group_commit(self.0), "could not commit service")
return Err(format!(
"could not register service: `{}`",
avahi_util::get_error(err)
)
.into());
}
let err = unsafe { avahi_entry_group_commit(self.0) };
if err < 0 {
Err(format!("could not commit service: `{}`", avahi_util::get_error(err)).into())
} else {
Ok(())
}
} }
/// Delegate function for [`avahi_entry_group_reset()`]. /// Delegate function for [`avahi_entry_group_reset()`].

View File

@ -1,6 +1,5 @@
//! Rust friendly `AvahiSimplePoll` wrappers/helpers //! Rust friendly `AvahiSimplePoll` wrappers/helpers
use super::avahi_util;
use crate::Result; use crate::Result;
use avahi_sys::{ use avahi_sys::{
avahi_simple_poll_free, avahi_simple_poll_iterate, avahi_simple_poll_loop, avahi_simple_poll_free, avahi_simple_poll_iterate, avahi_simple_poll_loop,
@ -30,16 +29,10 @@ impl ManagedAvahiSimplePoll {
/// ///
/// [`avahi_simple_poll_loop()`]: https://avahi.org/doxygen/html/simple-watch_8h.html#a14b4cb29832e8c3de609d4c4e5611985 /// [`avahi_simple_poll_loop()`]: https://avahi.org/doxygen/html/simple-watch_8h.html#a14b4cb29832e8c3de609d4c4e5611985
pub fn start_loop(&self) -> Result<()> { pub fn start_loop(&self) -> Result<()> {
let err = unsafe { avahi_simple_poll_loop(self.0) }; avahi!(
if err != 0 { avahi_simple_poll_loop(self.0),
Err(format!( "could not start AvahiSimplePoll"
"could not start AvahiSimplePoll: {}",
avahi_util::get_error(err)
) )
.into())
} else {
Ok(())
}
} }
/// Delegate function for [`avahi_simple_poll_iterate()`]. /// Delegate function for [`avahi_simple_poll_iterate()`].

View File

@ -128,6 +128,7 @@ mod tests {
let key1 = c_string!("foo"); let key1 = c_string!("foo");
let value1 = c_string!("bar"); let value1 = c_string!("bar");
unsafe {
list.add_pair( list.add_pair(
key1.as_ptr() as *const c_char, key1.as_ptr() as *const c_char,
value1.as_ptr() as *const c_char, value1.as_ptr() as *const c_char,
@ -156,6 +157,7 @@ mod tests {
assert_eq!(pair2.key().as_str(), "hello"); assert_eq!(pair2.key().as_str(), "hello");
assert_eq!(pair2.value().as_str(), "world"); assert_eq!(pair2.value().as_str(), "world");
} }
}
#[test] #[test]
fn add_pair_replaces_success() { fn add_pair_replaces_success() {
@ -165,6 +167,7 @@ mod tests {
let key = c_string!("foo"); let key = c_string!("foo");
let value = c_string!("bar"); let value = c_string!("bar");
unsafe {
list.add_pair( list.add_pair(
key.as_ptr() as *const c_char, key.as_ptr() as *const c_char,
value.as_ptr() as *const c_char, value.as_ptr() as *const c_char,
@ -185,6 +188,7 @@ mod tests {
assert_eq!(pair.value().as_str(), "baz"); assert_eq!(pair.value().as_str(), "baz");
} }
}
#[test] #[test]
fn length_success() { fn length_success() {
@ -194,6 +198,7 @@ mod tests {
let key = c_string!("foo"); let key = c_string!("foo");
let value = c_string!("bar"); let value = c_string!("bar");
unsafe {
list.add_pair( list.add_pair(
key.as_ptr() as *const c_char, key.as_ptr() as *const c_char,
value.as_ptr() as *const c_char, value.as_ptr() as *const c_char,
@ -201,6 +206,7 @@ mod tests {
assert_eq!(list.length(), 1); assert_eq!(list.length(), 1);
} }
}
#[test] #[test]
fn to_string_success() { fn to_string_success() {
@ -210,6 +216,7 @@ mod tests {
let key = c_string!("foo"); let key = c_string!("foo");
let value = c_string!("bar"); let value = c_string!("bar");
unsafe {
list.add_pair( list.add_pair(
key.as_ptr() as *const c_char, key.as_ptr() as *const c_char,
value.as_ptr() as *const c_char, value.as_ptr() as *const c_char,
@ -217,6 +224,7 @@ mod tests {
assert_eq!(list.to_string().as_str(), "\"foo=bar\""); assert_eq!(list.to_string().as_str(), "\"foo=bar\"");
} }
}
#[test] #[test]
fn equals_success() { fn equals_success() {
@ -226,6 +234,7 @@ mod tests {
let key = c_string!("foo"); let key = c_string!("foo");
let value = c_string!("bar"); let value = c_string!("bar");
unsafe {
list.add_pair( list.add_pair(
key.as_ptr() as *const c_char, key.as_ptr() as *const c_char,
value.as_ptr() as *const c_char, value.as_ptr() as *const c_char,
@ -233,4 +242,5 @@ mod tests {
assert_eq!(list.clone(), list); assert_eq!(list.clone(), list);
} }
}
} }

View File

@ -21,7 +21,26 @@ macro_rules! bonjour {
if err != 0 { if err != 0 {
crate::Result::Err(format!("{}", format!("{} (code: {})", $msg, err)).into()) crate::Result::Err(format!("{}", format!("{} (code: {})", $msg, err)).into())
} else { } else {
Ok(()) crate::Result::Ok(())
}
}};
}
#[cfg(target_os = "linux")]
macro_rules! avahi {
($call:expr, $msg:expr) => {{
#[allow(unused_unsafe)]
let err = unsafe { $call };
if err < 0 {
crate::Result::Err(
format!(
"{}",
format!("{}: `{}`", $msg, crate::linux::avahi_util::get_error(err))
)
.into(),
)
} else {
crate::Result::Ok(())
} }
}}; }};
} }