@@ -77,6 +77,14 @@ fn get_env_var_pattern_from_attr(attrs: &[Attribute]) -> Option<String> {
7777 . map ( |lit_str| lit_str. value ( ) )
7878}
7979
80+ fn get_added_in ( attrs : & [ Attribute ] ) -> Option < String > {
81+ attrs
82+ . iter ( )
83+ . find ( |a| a. path ( ) . is_ident ( "attr_added_in" ) )
84+ . and_then ( |attr| attr. parse_args :: < LitStr > ( ) . ok ( ) )
85+ . map ( |lit_str| lit_str. value ( ) )
86+ }
87+
8088fn is_hidden ( attrs : & [ Attribute ] ) -> bool {
8189 attrs. iter ( ) . any ( |attr| attr. path ( ) . is_ident ( "attr_hidden" ) )
8290}
@@ -92,6 +100,7 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
92100 . filter_map ( |item| match item {
93101 ImplItem :: Const ( item) if !is_hidden ( & item. attrs ) => {
94102 let doc = get_doc_comment ( & item. attrs ) ;
103+ let added_in = get_added_in ( & item. attrs ) ;
95104 let syn:: Expr :: Lit ( syn:: ExprLit {
96105 lit : syn:: Lit :: Str ( lit) ,
97106 ..
@@ -100,13 +109,14 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
100109 return None ;
101110 } ;
102111 let name = lit. value ( ) ;
103- Some ( ( name, doc) )
112+ Some ( ( name, doc, added_in ) )
104113 }
105114 ImplItem :: Fn ( item) if !is_hidden ( & item. attrs ) => {
106115 // Extract the environment variable patterns.
107116 if let Some ( pattern) = get_env_var_pattern_from_attr ( & item. attrs ) {
108117 let doc = get_doc_comment ( & item. attrs ) ;
109- Some ( ( pattern, doc) )
118+ let added_in = get_added_in ( & item. attrs ) ;
119+ Some ( ( pattern, doc, added_in) )
110120 } else {
111121 None // Skip if pattern extraction fails.
112122 }
@@ -116,9 +126,11 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
116126 . collect ( ) ;
117127
118128 let struct_name = & ast. self_ty ;
119- let pairs = constants. iter ( ) . map ( |( name, doc) | {
120- quote ! {
121- ( #name, #doc)
129+ let pairs = constants. iter ( ) . map ( |( name, doc, added_in) | {
130+ if let Some ( added_in) = added_in {
131+ quote ! { ( #name, #doc, Some ( #added_in) ) }
132+ } else {
133+ quote ! { ( #name, #doc, None ) }
122134 }
123135 } ) ;
124136
@@ -127,7 +139,7 @@ pub fn attribute_env_vars_metadata(_attr: TokenStream, input: TokenStream) -> To
127139
128140 impl #struct_name {
129141 /// Returns a list of pairs of env var and their documentation defined in this impl block.
130- pub fn metadata<' a>( ) -> & ' a [ ( & ' static str , & ' static str ) ] {
142+ pub fn metadata<' a>( ) -> & ' a [ ( & ' static str , & ' static str , Option < & ' static str > ) ] {
131143 & [ #( #pairs) , * ]
132144 }
133145 }
@@ -145,3 +157,8 @@ pub fn attr_hidden(_attr: TokenStream, item: TokenStream) -> TokenStream {
145157pub fn attr_env_var_pattern ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
146158 item
147159}
160+
161+ #[ proc_macro_attribute]
162+ pub fn attr_added_in ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
163+ item
164+ }
0 commit comments