devela/code/util/
deprecate.rs

1// devela::code::util::deprecate
2
3/// Configures a feature as deprecated, warning if it is enabled.
4///
5/// You can only call this macro once per deprecated feature.
6///
7/// # Examples
8/// ```
9/// # use devela::deprecate_feature;
10/// deprecate_feature![old: "old-feature-1"];
11/// deprecate_feature![old: "old-feature-2", since: "2.0.0"];
12/// deprecate_feature![old: "old-feature-3", new: "new_feature_3"];
13/// deprecate_feature![old: "old-feature-4", new: "new_feature_4", since: "4.0.0"];
14/// ```
15#[macro_export]
16#[cfg_attr(cargo_primary_package, doc(hidden))]
17macro_rules! deprecate_feature {
18    (     old:   $old_feature:literal
19      $(, new:   $new_feature:literal )?
20      $(, since:       $since:literal )?
21    ) => {
22        $crate::paste! {
23            // old, !new, !since
24            #[$crate::compile_attr(
25                all( none($($new_feature)?), none($($since)?) ),
26                deprecated(note = "\nWARNING. `" $old_feature
27                "` feature deprecated." )
28            )]
29
30            // old, !new, since
31            #[$crate::compile_attr(
32                all( none($($new_feature)?), some($($since)?) ),
33                deprecated( $(since = $since,)? note = "\nWARNING. `" $old_feature
34                "` feature deprecated since version " $($since)? "." )
35            )]
36
37            // old, new, !since
38            #[$crate::compile_attr(
39                all( some($($new_feature)?), none($($since)?) ),
40                deprecated(note = "\nWARNING. `" $old_feature
41                "` feature deprecated, use `" $($new_feature)? "` instead." )
42            )]
43
44            // old, new, since
45            #[$crate::compile_attr(
46                all( some($($new_feature)?), some($($since)?) ),
47                deprecated( $(since = $since,)? note = "\nWARNING. `" $old_feature
48                "` feature deprecated since version " $($since)?
49                ", use `" $($new_feature)? "` instead." )
50            )]
51
52            #[cfg(feature = $old_feature)]
53            const fn [<deprecate_feature_ $old_feature:snake>]() {}
54
55            #[cfg(feature = $old_feature)]
56            #[allow(dead_code)]
57            const [<DEPRECATED_ $old_feature:snake:upper>]: ()
58                = [<deprecate_feature_ $old_feature:snake>]();
59        }
60    };
61}
62#[doc(inline)]
63pub use deprecate_feature;