11use cargo_platform:: { Cfg , CfgExpr , CfgRustVersion , Ident , Platform } ;
2+ use semver:: { BuildMetadata , Prerelease } ;
23use std:: fmt;
34use std:: str:: FromStr ;
45
@@ -33,10 +34,16 @@ macro_rules! c {
3334 $e. to_string( ) ,
3435 )
3536 } ;
37+ ( version( $minor: literal) ) => {
38+ Cfg :: Version ( CfgRustVersion {
39+ minor: $minor,
40+ patch: None ,
41+ } )
42+ } ;
3643 ( version( $minor: literal, $patch: literal) ) => {
3744 Cfg :: Version ( CfgRustVersion {
3845 minor: $minor,
39- patch: $patch,
46+ patch: Some ( $patch) ,
4047 } )
4148 } ;
4249}
@@ -51,6 +58,7 @@ macro_rules! e {
5158 ( $( $t: tt) * ) => ( CfgExpr :: Value ( c!( $( $t) * ) ) ) ;
5259}
5360
61+ #[ track_caller]
5462fn good < T > ( s : & str , expected : T )
5563where
5664 T : FromStr + PartialEq + fmt:: Debug ,
6371 assert_eq ! ( c, expected) ;
6472}
6573
74+ #[ track_caller]
6675fn bad < T > ( s : & str , err : & str )
6776where
6877 T : FromStr + fmt:: Display ,
@@ -96,6 +105,7 @@ fn cfg_syntax() {
96105 good ( "foo = \" 3 e\" " , c ! ( foo = "3 e" ) ) ;
97106 good ( " r#foo = \" 3 e\" " , c ! ( r # foo = "3 e" ) ) ;
98107 good ( "version(\" 1.23.4\" )" , c ! ( version( 23 , 4 ) ) ) ;
108+ good ( "version(\" 1.23\" )" , c ! ( version( 23 ) ) ) ;
99109 good ( "version(\" 1.234.56\" )" , c ! ( version( 234 , 56 ) ) ) ;
100110 good ( " version(\" 1.23.4\" )" , c ! ( version( 23 , 4 ) ) ) ;
101111 good ( "version(\" 1.23.4\" ) " , c ! ( version( 23 , 4 ) ) ) ;
@@ -172,34 +182,56 @@ fn cfg_expr_bad() {
172182
173183#[ test]
174184fn cfg_matches ( ) {
175- let rustc_version = semver:: Version :: new ( 0 , 0 , 0 ) ;
176- assert ! ( e!( foo) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & rustc_version ) ) ;
177- assert ! ( e!( any( foo) ) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & rustc_version ) ) ;
178- assert ! ( e!( any( foo, bar) ) . matches( & [ c!( bar) ] , & rustc_version ) ) ;
179- assert ! ( e!( any( foo, bar) ) . matches( & [ c!( foo) ] , & rustc_version ) ) ;
180- assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & rustc_version ) ) ;
181- assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & rustc_version ) ) ;
182- assert ! ( e!( not( foo) ) . matches( & [ c!( bar) ] , & rustc_version ) ) ;
183- assert ! ( e!( not( foo) ) . matches( & [ ] , & rustc_version ) ) ;
184- assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( bar) ] , & rustc_version ) ) ;
185- assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) , c!( bar) ] , & rustc_version ) ) ;
186- assert ! ( e!( foo) . matches( & [ c!( r # foo) ] , & rustc_version ) ) ;
187- assert ! ( e!( r # foo) . matches( & [ c!( foo) ] , & rustc_version ) ) ;
188- assert ! ( e!( r # foo) . matches( & [ c!( r # foo) ] , & rustc_version ) ) ;
185+ let v87 = semver:: Version :: new ( 1 , 87 , 0 ) ;
186+ assert ! ( e!( foo) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & v87 ) ) ;
187+ assert ! ( e!( any( foo) ) . matches( & [ c!( bar) , c!( foo) , c!( baz) ] , & v87 ) ) ;
188+ assert ! ( e!( any( foo, bar) ) . matches( & [ c!( bar) ] , & v87 ) ) ;
189+ assert ! ( e!( any( foo, bar) ) . matches( & [ c!( foo) ] , & v87 ) ) ;
190+ assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & v87 ) ) ;
191+ assert ! ( e!( all( foo, bar) ) . matches( & [ c!( foo) , c!( bar) ] , & v87 ) ) ;
192+ assert ! ( e!( not( foo) ) . matches( & [ c!( bar) ] , & v87 ) ) ;
193+ assert ! ( e!( not( foo) ) . matches( & [ ] , & v87 ) ) ;
194+ assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( bar) ] , & v87 ) ) ;
195+ assert ! ( e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) , c!( bar) ] , & v87 ) ) ;
196+ assert ! ( e!( foo) . matches( & [ c!( r # foo) ] , & v87 ) ) ;
197+ assert ! ( e!( r # foo) . matches( & [ c!( foo) ] , & v87 ) ) ;
198+ assert ! ( e!( r # foo) . matches( & [ c!( r # foo) ] , & v87 ) ) ;
189199
190- assert ! ( !e!( foo) . matches( & [ ] , & rustc_version) ) ;
191- assert ! ( !e!( foo) . matches( & [ c!( bar) ] , & rustc_version) ) ;
192- assert ! ( !e!( foo) . matches( & [ c!( fo) ] , & rustc_version) ) ;
193- assert ! ( !e!( any( foo) ) . matches( & [ ] , & rustc_version) ) ;
194- assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) ] , & rustc_version) ) ;
195- assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & rustc_version) ) ;
196- assert ! ( !e!( all( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & rustc_version) ) ;
197- assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( bar) ] , & rustc_version) ) ;
198- assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( foo) ] , & rustc_version) ) ;
199- assert ! ( !e!( all( foo, bar) ) . matches( & [ ] , & rustc_version) ) ;
200- assert ! ( !e!( not( bar) ) . matches( & [ c!( bar) ] , & rustc_version) ) ;
201- assert ! ( !e!( not( bar) ) . matches( & [ c!( baz) , c!( bar) ] , & rustc_version) ) ;
202- assert ! ( !e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) ] , & rustc_version) ) ;
200+ assert ! ( !e!( foo) . matches( & [ ] , & v87) ) ;
201+ assert ! ( !e!( foo) . matches( & [ c!( bar) ] , & v87) ) ;
202+ assert ! ( !e!( foo) . matches( & [ c!( fo) ] , & v87) ) ;
203+ assert ! ( !e!( any( foo) ) . matches( & [ ] , & v87) ) ;
204+ assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) ] , & v87) ) ;
205+ assert ! ( !e!( any( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & v87) ) ;
206+ assert ! ( !e!( all( foo) ) . matches( & [ c!( bar) , c!( baz) ] , & v87) ) ;
207+ assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( bar) ] , & v87) ) ;
208+ assert ! ( !e!( all( foo, bar) ) . matches( & [ c!( foo) ] , & v87) ) ;
209+ assert ! ( !e!( all( foo, bar) ) . matches( & [ ] , & v87) ) ;
210+ assert ! ( !e!( not( bar) ) . matches( & [ c!( bar) ] , & v87) ) ;
211+ assert ! ( !e!( not( bar) ) . matches( & [ c!( baz) , c!( bar) ] , & v87) ) ;
212+ assert ! ( !e!( any( ( not( foo) ) , ( all( foo, bar) ) ) ) . matches( & [ c!( foo) ] , & v87) ) ;
213+
214+ assert ! ( e!( version( 87 ) ) . matches( & [ ] , & v87) ) ;
215+ assert ! ( e!( version( 87 , 0 ) ) . matches( & [ ] , & v87) ) ;
216+ assert ! ( e!( version( 86 ) ) . matches( & [ ] , & v87) ) ;
217+ assert ! ( e!( version( 86 , 1 ) ) . matches( & [ ] , & v87) ) ;
218+ assert ! ( !e!( version( 87 , 1 ) ) . matches( & [ ] , & v87) ) ;
219+ assert ! ( !e!( version( 88 ) ) . matches( & [ ] , & v87) ) ;
220+ assert ! ( !e!( version( 88 , 1 ) ) . matches( & [ ] , & v87) ) ;
221+ assert ! ( e!( not( version( 88 ) ) ) . matches( & [ ] , & v87) ) ;
222+ assert ! ( e!( not( version( 88 , 1 ) ) ) . matches( & [ ] , & v87) ) ;
223+
224+ let v89_nightly = semver:: Version {
225+ major : 1 ,
226+ minor : 89 ,
227+ patch : 0 ,
228+ pre : Prerelease :: new ( "nightly" ) . unwrap ( ) ,
229+ build : BuildMetadata :: EMPTY ,
230+ } ;
231+ assert ! ( e!( version( 89 ) ) . matches( & [ ] , & v89_nightly) ) ;
232+ assert ! ( !e!( version( 89 , 0 ) ) . matches( & [ ] , & v89_nightly) ) ;
233+ assert ! ( e!( version( 88 ) ) . matches( & [ ] , & v89_nightly) ) ;
234+ assert ! ( e!( version( 88 , 0 ) ) . matches( & [ ] , & v89_nightly) ) ;
203235}
204236
205237#[ test]
0 commit comments