const_semver/
macros.rs

1#[macro_export]
2macro_rules! ident {
3    ($n:literal) => {
4        $crate::Identifier::Numeric($n)
5    };
6    ($s:ident) => {
7        $crate::Identifier::Alphanumeric(stringify!($s))
8    };
9}
10
11#[macro_export]
12macro_rules! version {
13    ($major:literal,$minor:literal,$patch:literal $(- $( $pre:tt ),*)? $(+ $( $build:tt ),*)?) => {
14        $crate::Version::new($major, $minor, $patch)
15            .pre(&[
16                $($( $crate::ident!($pre) ),*)?
17            ])
18            .build(&[
19                $($( $crate::ident!($build) ),*)?
20            ])
21    };
22}
23
24#[cfg(test)]
25mod tests {
26    #[test]
27    fn test_long_macro() {
28        let version: semver::Version = version!(1, 2, 3 - alpha, 6, 4 + amd64).into();
29
30        assert_eq!(version.major, 1);
31        assert_eq!(version.minor, 2);
32        assert_eq!(version.patch, 3);
33
34        assert_eq!(
35            version.build,
36            vec![semver::Identifier::AlphaNumeric("amd64".to_string())]
37        );
38        assert_eq!(
39            version,
40            semver::Version::parse("1.2.3-alpha.6.4+amd64").unwrap()
41        );
42    }
43
44    #[test]
45    fn test_short_version() {
46        let version: semver::Version = version!(1, 2, 0).into();
47        assert_eq!(version, semver::Version::parse("1.2.0").unwrap());
48    }
49}