1use std::marker::PhantomData;
2
3pub trait ConfigureOptions<T> {
9 fn configure(&self, name: Option<&str>, options: &mut T);
16}
17
18pub trait PostConfigureOptions<T> {
24 fn post_configure(&self, name: Option<&str>, options: &mut T);
31}
32
33pub fn configure<T, F>(action: F) -> impl ConfigureOptions<T>
39where
40 F: Fn(Option<&str>, &mut T),
41{
42 _ConfigureOptions::new(action)
43}
44
45pub fn post_configure<T, F>(action: F) -> impl PostConfigureOptions<T>
51where
52 F: Fn(Option<&str>, &mut T),
53{
54 _ConfigureOptions::new(action)
55}
56
57struct _ConfigureOptions<TOptions, TAction>
58where
59 TAction: Fn(Option<&str>, &mut TOptions),
60{
61 action: TAction,
62 _marker: PhantomData<TOptions>,
63}
64
65impl<TOptions, TAction> _ConfigureOptions<TOptions, TAction>
66where
67 TAction: Fn(Option<&str>, &mut TOptions),
68{
69 fn new(action: TAction) -> Self {
70 Self {
71 action,
72 _marker: PhantomData,
73 }
74 }
75}
76
77impl<TOptions, TAction> ConfigureOptions<TOptions> for _ConfigureOptions<TOptions, TAction>
78where
79 TAction: Fn(Option<&str>, &mut TOptions),
80{
81 fn configure(&self, name: Option<&str>, options: &mut TOptions) {
82 (self.action)(name, options)
83 }
84}
85
86impl<TOptions, TAction> PostConfigureOptions<TOptions> for _ConfigureOptions<TOptions, TAction>
87where
88 TAction: Fn(Option<&str>, &mut TOptions),
89{
90 fn post_configure(&self, name: Option<&str>, options: &mut TOptions) {
91 (self.action)(name, options)
92 }
93}