@@ -42,3 +42,39 @@ pub async fn check_latest_version() -> Result<Option<String>> {
4242 }
4343 Ok ( None )
4444}
45+
46+ fn parse_version ( v : & str ) -> Option < ( u32 , u32 , u32 ) > {
47+ let parts: Vec < _ > = v. split ( '.' ) . filter_map ( |p| p. parse :: < u32 > ( ) . ok ( ) ) . collect ( ) ;
48+ ( parts. len ( ) == 3 ) . then ( || ( parts[ 0 ] , parts[ 1 ] , parts[ 2 ] ) )
49+ }
50+
51+ pub fn is_older_version ( current : & str , latest : & str ) -> bool {
52+ matches ! ( ( parse_version( current) , parse_version( latest) ) , ( Some ( c) , Some ( l) ) if c < l)
53+ }
54+
55+ pub fn is_newer_version ( current : & str , latest : & str ) -> bool {
56+ matches ! ( ( parse_version( current) , parse_version( latest) ) , ( Some ( c) , Some ( l) ) if c > l)
57+ }
58+
59+ #[ cfg( test) ]
60+ mod tests {
61+ use super :: * ;
62+
63+ #[ test]
64+ fn test_current_version_equal ( ) {
65+ assert ! ( !is_older_version( "0.3.39" , "0.3.39" ) ) ;
66+ assert ! ( !is_newer_version( "0.3.39" , "0.3.39" ) ) ;
67+ }
68+
69+ #[ test]
70+ fn test_older_version ( ) {
71+ assert ! ( is_older_version( "0.3.38" , "0.3.39" ) ) ;
72+ assert ! ( !is_newer_version( "0.3.38" , "0.3.39" ) ) ;
73+ }
74+
75+ #[ test]
76+ fn test_newer_version ( ) {
77+ assert ! ( !is_older_version( "0.3.40" , "0.3.39" ) ) ;
78+ assert ! ( is_newer_version( "0.3.40" , "0.3.39" ) ) ;
79+ }
80+ }
0 commit comments