1use cfg_if::cfg_if;
2
3#[cfg_attr(feature = "async", maybe_impl::traits(Send, Sync))]
9pub trait Configure<T> {
10 fn run(&self, name: &str, options: &mut T);
17}
18
19#[cfg_attr(feature = "async", maybe_impl::traits(Send, Sync))]
25pub trait PostConfigure<T> {
26 fn run(&self, name: &str, options: &mut T);
33}
34
35macro_rules! configure {
36 ($($bounds:tt)+) => {
37 impl<F: Fn(&str, &mut T) + $($bounds)+, T> Configure<T> for F {
38 fn run(&self, name: &str, options: &mut T) {
39 (self)(name, options)
40 }
41 }
42
43 impl<F: Fn(&str, &mut T) + $($bounds)+, T> PostConfigure<T> for F {
44 fn run(&self, name: &str, options: &mut T) {
45 (self)(name, options)
46 }
47 }
48 }
49}
50
51cfg_if! {
52 if #[cfg(feature = "async")] {
53 configure!(Sized + Send + Sync);
54 } else {
55 configure!(Sized);
56 }
57}