1818 */
1919
2020use crossterm:: style:: Stylize ;
21+ use std:: fmt;
2122use sysinfo:: { System , SystemExt } ;
2223
2324pub fn system_info ( ) {
@@ -44,56 +45,104 @@ pub fn warning_line() {
4445 ) ;
4546}
4647
48+ pub enum ParseableVersion {
49+ Version ( semver:: Version ) ,
50+ Prerelease ( semver:: Prerelease ) ,
51+ }
52+
53+ impl fmt:: Display for ParseableVersion {
54+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
55+ match self {
56+ ParseableVersion :: Version ( v) => write ! ( f, "{}" , v) ,
57+ ParseableVersion :: Prerelease ( p) => write ! ( f, "{}" , p) ,
58+ }
59+ }
60+ }
61+
4762pub mod version {
4863 use chrono:: Duration ;
4964 use chrono_humanize:: { Accuracy , Tense } ;
5065 use crossterm:: style:: Stylize ;
51- use semver:: Version ;
66+ use semver:: { Prerelease , Version } ;
5267
5368 use crate :: utils:: update;
5469
70+ use super :: ParseableVersion ;
71+
5572 pub fn print ( ) {
5673 // print current version
5774 let current = current ( ) ;
58- // not eprintln because if it is old release then time passed with be displayed beside it
59- eprint ! (
60- "
75+
76+ match current {
77+ ParseableVersion :: Version ( current_version) => {
78+ // not eprintln because if it is old release then time passed with be displayed beside it
79+ eprint ! (
80+ "
6181 {} {} " ,
62- "Current Version:" . to_string( ) . blue( ) . bold( ) ,
63- current
64- ) ;
65-
66- // check for latest release, if it cannot be fetched then print error as warn and return
67- let latest_release = match update:: get_latest ( ) {
68- Ok ( latest_release) => latest_release,
69- Err ( e) => {
70- log:: warn!( "{}" , e) ;
71- return ;
72- }
73- } ;
82+ "Current Version:" . to_string( ) . blue( ) . bold( ) ,
83+ current_version
84+ ) ;
85+
86+ // check for latest release, if it cannot be fetched then print error as warn and return
87+ let latest_release = match update:: get_latest ( ) {
88+ Ok ( latest_release) => latest_release,
89+ Err ( e) => {
90+ log:: warn!( "{}" , e) ;
91+ return ;
92+ }
93+ } ;
7494
75- if latest_release. version > current {
76- let time_since_latest_release = chrono:: Utc :: now ( ) - latest_release. date ;
77- let time_since_latest_release = humanize_time ( time_since_latest_release) ;
95+ if latest_release. version > current_version {
96+ let time_since_latest_release = chrono:: Utc :: now ( ) - latest_release. date ;
97+ let time_since_latest_release = humanize_time ( time_since_latest_release) ;
7898
79- let fmt_latest_version = format ! (
80- "( v{} released {} ago )" ,
81- latest_release. version, time_since_latest_release
82- ) ;
99+ let fmt_latest_version = format ! (
100+ "( v{} released {} ago )" ,
101+ latest_release. version, time_since_latest_release
102+ ) ;
83103
84- eprint ! ( "{}" , fmt_latest_version. yellow( ) . bold( ) ) ;
85- eprintln ! (
86- "
104+ eprint ! ( "{}" , fmt_latest_version. yellow( ) . bold( ) ) ;
105+ eprintln ! (
106+ "
87107 Download latest version from https://github.com/parseablehq/parseable/releases/latest"
88- ) ;
89- } else {
90- eprintln ! ( ) ;
108+ ) ;
109+ } else {
110+ eprintln ! ( ) ;
111+ }
112+ }
113+ ParseableVersion :: Prerelease ( current_prerelease) => {
114+ eprint ! (
115+ "
116+ {} {} " ,
117+ "Current Version:" . to_string( ) . blue( ) . bold( ) ,
118+ current_prerelease
119+ ) ;
120+ }
91121 }
92122 }
93123
94- pub fn current ( ) -> Version {
95- let current = env ! ( "VERGEN_BUILD_SEMVER" ) ;
96- semver:: Version :: parse ( current) . expect ( "VERGEN_BUILD_SEMVER is always valid semver" )
124+ pub fn current ( ) -> ParseableVersion {
125+ let build_semver = env ! ( "VERGEN_BUILD_SEMVER" ) ;
126+
127+ let mut git_semver = env ! ( "VERGEN_GIT_SEMVER" ) ;
128+
129+ if git_semver. chars ( ) . nth ( 0 ) . unwrap ( ) == 'v' {
130+ let mut git_semver_chars = git_semver. chars ( ) ;
131+ git_semver_chars. next ( ) ;
132+ git_semver = git_semver_chars. as_str ( ) ;
133+ }
134+
135+ if build_semver == git_semver {
136+ ParseableVersion :: Version (
137+ semver:: Version :: parse ( build_semver)
138+ . expect ( "VERGEN_BUILD_SEMVER is always valid semver" ) ,
139+ )
140+ } else {
141+ ParseableVersion :: Prerelease (
142+ semver:: Prerelease :: new ( git_semver)
143+ . expect ( "VERGEN_GIT_SEMVER is always valid semver" ) ,
144+ )
145+ }
97146 }
98147
99148 fn humanize_time ( time_passed : Duration ) -> String {
0 commit comments