1use crate::proto::Version;
10
11include!("../gen/version.in");
12
13pub fn version() -> Version {
18 Version {
19 major_number: SUBSTRAIT_MAJOR_VERSION,
20 minor_number: SUBSTRAIT_MINOR_VERSION,
21 patch_number: SUBSTRAIT_PATCH_VERSION,
22 git_hash: if SUBSTRAIT_GIT_DEPTH != 0 {
23 String::from(SUBSTRAIT_GIT_SHA)
24 } else {
25 String::default()
26 },
27 ..Default::default()
28 }
29}
30
31pub fn version_with_producer(producer: impl Into<String>) -> Version {
34 Version {
35 producer: producer.into(),
36 ..version()
37 }
38}
39
40#[cfg(feature = "semver")]
42pub fn semver() -> semver::Version {
43 semver::Version {
44 major: SUBSTRAIT_MAJOR_VERSION as _,
45 minor: SUBSTRAIT_MINOR_VERSION as _,
46 patch: SUBSTRAIT_PATCH_VERSION as _,
47 pre: if SUBSTRAIT_GIT_DEPTH != 0 {
48 semver::Prerelease::new(&SUBSTRAIT_GIT_DEPTH.to_string()).unwrap()
49 } else {
50 semver::Prerelease::EMPTY
51 },
52 build: semver::BuildMetadata::new(SUBSTRAIT_GIT_SHA).unwrap(),
53 }
54}
55
56#[cfg(feature = "semver")]
58pub fn semver_req() -> semver::VersionReq {
59 semver::VersionReq::parse(&format!("^{}", semver())).unwrap()
60}
61
62#[cfg(test)]
63mod tests {
65 #[test]
66 fn no_git_hash() {
67 assert!(super::version().git_hash.is_empty());
70 }
71
72 #[test]
73 #[allow(clippy::assertions_on_constants)]
74 fn not_dirty() {
75 assert!(!super::SUBSTRAIT_GIT_DESCRIBE.contains("dirty"));
77 assert!(!super::SUBSTRAIT_GIT_DIRTY);
78 }
79
80 #[test]
81 fn no_pre_release() {
82 #[cfg(feature = "semver")]
85 assert!(super::semver().pre.is_empty());
86 assert_eq!(super::SUBSTRAIT_GIT_DEPTH, 0);
87 }
88}