11use  std:: fmt; 
22use  std:: str:: FromStr ; 
33
4- use  cargo_platform:: { Cfg ,  CfgExpr ,  Ident ,  Platform } ; 
4+ use  cargo_platform:: { Cfg ,  CfgExpr ,  CfgRustVersion ,  Ident ,  Platform } ; 
5+ use  semver:: { BuildMetadata ,  Prerelease } ; 
56use  snapbox:: assert_data_eq; 
67use  snapbox:: prelude:: * ; 
78use  snapbox:: str; 
@@ -37,6 +38,18 @@ macro_rules! c {
3738            $e. to_string( ) , 
3839        ) 
3940    } ; 
41+     ( version( $minor: literal) )  => { 
42+         Cfg :: Version ( CfgRustVersion  { 
43+             minor:  $minor, 
44+             patch:  None , 
45+         } ) 
46+     } ; 
47+     ( version( $minor: literal,  $patch: literal) )  => { 
48+         Cfg :: Version ( CfgRustVersion  { 
49+             minor:  $minor, 
50+             patch:  Some ( $patch) , 
51+         } ) 
52+     } ; 
4053} 
4154
4255macro_rules!  e { 
@@ -88,42 +101,12 @@ fn cfg_syntax() {
88101    good ( " foo=\" 3\"       " ,  c ! ( foo = "3" ) ) ; 
89102    good ( "foo = \" 3 e\" " ,  c ! ( foo = "3 e" ) ) ; 
90103    good ( " r#foo = \" 3 e\" " ,  c ! ( r # foo = "3 e" ) ) ; 
91-     bad :: < Cfg > ( 
92-         "version(\" 1.23.4\" )" , 
93-         str![ [ 
94-             r#"failed to parse `version("1.23.4")` as a cfg expression: unexpected content `("1.23.4")` found after cfg expression"# 
95-         ] ] , 
96-     ) ; 
97-     bad :: < Cfg > ( 
98-         "version(\" 1.23\" )" , 
99-         str![ [ 
100-             r#"failed to parse `version("1.23")` as a cfg expression: unexpected content `("1.23")` found after cfg expression"# 
101-         ] ] , 
102-     ) ; 
103-     bad :: < Cfg > ( 
104-         "version(\" 1.234.56\" )" , 
105-         str![ [ 
106-             r#"failed to parse `version("1.234.56")` as a cfg expression: unexpected content `("1.234.56")` found after cfg expression"# 
107-         ] ] , 
108-     ) ; 
109-     bad :: < Cfg > ( 
110-         " version(\" 1.23.4\" )" , 
111-         str![ [ 
112-             r#"failed to parse ` version("1.23.4")` as a cfg expression: unexpected content `("1.23.4")` found after cfg expression"# 
113-         ] ] , 
114-     ) ; 
115-     bad :: < Cfg > ( 
116-         "version(\" 1.23.4\" ) " , 
117-         str![ [ 
118-             r#"failed to parse `version("1.23.4") ` as a cfg expression: unexpected content `("1.23.4") ` found after cfg expression"# 
119-         ] ] , 
120-     ) ; 
121-     bad :: < Cfg > ( 
122-         " version(\" 1.23.4\" ) " , 
123-         str![ [ 
124-             r#"failed to parse ` version("1.23.4") ` as a cfg expression: unexpected content `("1.23.4") ` found after cfg expression"# 
125-         ] ] , 
126-     ) ; 
104+     good ( "version(\" 1.23.4\" )" ,  c ! ( version( 23 ,  4 ) ) ) ; 
105+     good ( "version(\" 1.23\" )" ,  c ! ( version( 23 ) ) ) ; 
106+     good ( "version(\" 1.234.56\" )" ,  c ! ( version( 234 ,  56 ) ) ) ; 
107+     good ( " version(\" 1.23.4\" )" ,  c ! ( version( 23 ,  4 ) ) ) ; 
108+     good ( "version(\" 1.23.4\" ) " ,  c ! ( version( 23 ,  4 ) ) ) ; 
109+     good ( " version(\" 1.23.4\" ) " ,  c ! ( version( 23 ,  4 ) ) ) ; 
127110    good ( "version = \" 1.23.4\" " ,  c ! ( version = "1.23.4" ) ) ; 
128111} 
129112
@@ -153,43 +136,43 @@ fn cfg_syntax_bad() {
153136    bad :: < Cfg > ( 
154137        "version(\" 1\" )" , 
155138        str![ [ 
156-             r#"failed to parse `version("1")` as a cfg expression: unexpected content ` ("1")` found after cfg expression "# 
139+             r#"failed to parse `version("1")` as a cfg expression: invalid Rust cfg version, expected format `version ("1.23.4 ")` or `version("1.23")` "# 
157140        ] ] , 
158141    ) ; 
159142    bad :: < Cfg > ( 
160143        "version(\" 1.\" )" , 
161144        str![ [ 
162-             r#"failed to parse `version("1.")` as a cfg expression: unexpected content ` ("1.")` found after cfg expression "# 
145+             r#"failed to parse `version("1.")` as a cfg expression: invalid Rust cfg version, expected format `version ("1.23.4 ")` or `version("1.23")` "# 
163146        ] ] , 
164147    ) ; 
165148    bad :: < Cfg > ( 
166149        "version(\" 1.2.\" )" , 
167150        str![ [ 
168-             r#"failed to parse `version("1.2.")` as a cfg expression: unexpected content ` ("1.2. ")` found after cfg expression "# 
151+             r#"failed to parse `version("1.2.")` as a cfg expression: invalid Rust cfg version, expected format `version ("1.23.4 ")` or `version("1.23")` "# 
169152        ] ] , 
170153    ) ; 
171154    bad :: < Cfg > ( 
172155        "version(\" 1.2.3.\" )" , 
173156        str![ [ 
174-             r#"failed to parse `version("1.2.3.")` as a cfg expression: unexpected content ` ("1.2.3. ")` found after cfg expression "# 
157+             r#"failed to parse `version("1.2.3.")` as a cfg expression: invalid Rust cfg version, expected format `version ("1.23.4 ")` or `version("1.23")` "# 
175158        ] ] , 
176159    ) ; 
177160    bad :: < Cfg > ( 
178161        "version(\" 1.2.3-stable\" )" , 
179162        str![ [ 
180-             r#"failed to parse `version("1.2.3-stable")` as a cfg expression: unexpected content ` ("1.2.3-stable ")` found after cfg expression "# 
163+             r#"failed to parse `version("1.2.3-stable")` as a cfg expression: invalid Rust cfg version, expected format `version ("1.23.4 ")` or `version("1.23")` "# 
181164        ] ] , 
182165    ) ; 
183166    bad :: < Cfg > ( 
184167        "version(\" 2.3\" )" , 
185168        str![ [ 
186-             r#"failed to parse `version("2.3")` as a cfg expression: unexpected content `("2.3 ")` found after cfg expression "# 
169+             r#"failed to parse `version("2.3")` as a cfg expression: invalid Rust cfg version, expected format `version("1.23.4 ")` or `version("1.23")` "# 
187170        ] ] , 
188171    ) ; 
189172    bad :: < Cfg > ( 
190173        "version(\" 0.99.9\" )" , 
191174        str![ [ 
192-             r#"failed to parse `version("0.99.9")` as a cfg expression: unexpected content `("0.99.9 ")` found after cfg expression "# 
175+             r#"failed to parse `version("0.99.9")` as a cfg expression: invalid Rust cfg version, expected format `version("1.23.4 ")` or `version("1.23")` "# 
193176        ] ] , 
194177    ) ; 
195178} 
@@ -214,12 +197,7 @@ fn cfg_expr() {
214197    good ( "all(a, )" ,  e ! ( all( a) ) ) ; 
215198    good ( "not(a = \" b\" )" ,  e ! ( not( a = "b" ) ) ) ; 
216199    good ( "not(all(a))" ,  e ! ( not( all( a) ) ) ) ; 
217-     bad :: < Cfg > ( 
218-         "not(version(\" 1.23.4\" ))" , 
219-         str![ [ 
220-             r#"failed to parse `not(version("1.23.4"))` as a cfg expression: unexpected content `(version("1.23.4"))` found after cfg expression"# 
221-         ] ] , 
222-     ) ; 
200+     good ( "not(version(\" 1.23.4\" ))" ,  e ! ( not( version( 23 ,  4 ) ) ) ) ; 
223201} 
224202
225203#[ test]  
@@ -279,6 +257,28 @@ fn cfg_matches() {
279257    assert ! ( !e!( not( bar) ) . matches( & [ c!( bar) ] ,  & v87) ) ; 
280258    assert ! ( !e!( not( bar) ) . matches( & [ c!( baz) ,  c!( bar) ] ,  & v87) ) ; 
281259    assert ! ( !e!( any( ( not( foo) ) ,  ( all( foo,  bar) ) ) ) . matches( & [ c!( foo) ] ,  & v87) ) ; 
260+ 
261+     assert ! ( e!( version( 87 ) ) . matches( & [ ] ,  & v87) ) ; 
262+     assert ! ( e!( version( 87 ,  0 ) ) . matches( & [ ] ,  & v87) ) ; 
263+     assert ! ( e!( version( 86 ) ) . matches( & [ ] ,  & v87) ) ; 
264+     assert ! ( e!( version( 86 ,  1 ) ) . matches( & [ ] ,  & v87) ) ; 
265+     assert ! ( !e!( version( 87 ,  1 ) ) . matches( & [ ] ,  & v87) ) ; 
266+     assert ! ( !e!( version( 88 ) ) . matches( & [ ] ,  & v87) ) ; 
267+     assert ! ( !e!( version( 88 ,  1 ) ) . matches( & [ ] ,  & v87) ) ; 
268+     assert ! ( e!( not( version( 88 ) ) ) . matches( & [ ] ,  & v87) ) ; 
269+     assert ! ( e!( not( version( 88 ,  1 ) ) ) . matches( & [ ] ,  & v87) ) ; 
270+ 
271+     let  v89_nightly = semver:: Version  { 
272+         major :  1 , 
273+         minor :  89 , 
274+         patch :  0 , 
275+         pre :  Prerelease :: new ( "nightly" ) . unwrap ( ) , 
276+         build :  BuildMetadata :: EMPTY , 
277+     } ; 
278+     assert ! ( e!( version( 89 ) ) . matches( & [ ] ,  & v89_nightly) ) ; 
279+     assert ! ( !e!( version( 89 ,  0 ) ) . matches( & [ ] ,  & v89_nightly) ) ; 
280+     assert ! ( e!( version( 88 ) ) . matches( & [ ] ,  & v89_nightly) ) ; 
281+     assert ! ( e!( version( 88 ,  0 ) ) . matches( & [ ] ,  & v89_nightly) ) ; 
282282} 
283283
284284#[ test]  
0 commit comments