use cfg_if::cfg_if;
#[cfg_attr(feature = "async", maybe_impl::traits(Send, Sync))]
pub trait Configure<T> {
fn run(&self, name: &str, options: &mut T);
}
#[cfg_attr(feature = "async", maybe_impl::traits(Send, Sync))]
pub trait PostConfigure<T> {
fn run(&self, name: &str, options: &mut T);
}
macro_rules! configure {
($($bounds:tt)+) => {
impl<F: Fn(&str, &mut T) + $($bounds)+, T> Configure<T> for F {
fn run(&self, name: &str, options: &mut T) {
(self)(name, options)
}
}
impl<F: Fn(&str, &mut T) + $($bounds)+, T> PostConfigure<T> for F {
fn run(&self, name: &str, options: &mut T) {
(self)(name, options)
}
}
}
}
cfg_if! {
if #[cfg(feature = "async")] {
configure!(Sized + Send + Sync);
} else {
configure!(Sized);
}
}