@@ -2,7 +2,7 @@ use std::path::Path;
22
33#[ derive( Debug ) ]
44pub ( crate ) struct Migration {
5- pub ( crate ) timestamp : u64 ,
5+ pub ( crate ) sequence_number : u64 ,
66 #[ allow( unused) ]
77 pub ( crate ) name : String ,
88}
@@ -33,12 +33,7 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option<Migrat
3333 let root_migration = path
3434 . file_name ( )
3535 . and_then ( |os_str| os_str. to_str ( ) )
36- . and_then ( |file_name| {
37- let mut parts = file_name. splitn ( 2 , '_' ) ;
38- let timestamp = parts. next ( ) ?. parse ( ) . ok ( ) ?;
39- let name = parts. next ( ) ?. to_string ( ) ;
40- Some ( Migration { timestamp, name } )
41- } ) ;
36+ . and_then ( parse_migration_name) ;
4237
4338 if root_migration. is_some ( ) {
4439 return root_migration;
@@ -49,12 +44,22 @@ pub(crate) fn get_migration(path: &Path, migrations_dir: &Path) -> Option<Migrat
4944 path. parent ( )
5045 . and_then ( |parent| parent. file_name ( ) )
5146 . and_then ( |os_str| os_str. to_str ( ) )
52- . and_then ( |dir_name| {
53- let mut parts = dir_name. splitn ( 2 , '_' ) ;
54- let timestamp = parts. next ( ) ?. parse ( ) . ok ( ) ?;
55- let name = parts. next ( ) ?. to_string ( ) ;
56- Some ( Migration { timestamp, name } )
57- } )
47+ . and_then ( parse_migration_name)
48+ }
49+
50+ fn parse_migration_name ( name : & str ) -> Option < Migration > {
51+ let mut parts = name. splitn ( 2 , '_' ) ;
52+ // remove leading zeros to support numeric
53+ let sequence_number: u64 = parts. next ( ) ?. trim_start_matches ( '0' ) . parse ( ) . ok ( ) ?;
54+ let full_name = parts. next ( ) ?;
55+ let name = full_name
56+ . strip_suffix ( ".sql" )
57+ . unwrap_or ( full_name)
58+ . to_string ( ) ;
59+ Some ( Migration {
60+ sequence_number,
61+ name,
62+ } )
5863}
5964
6065#[ cfg( test) ]
@@ -79,8 +84,8 @@ mod tests {
7984
8085 assert ! ( migration. is_some( ) ) ;
8186 let migration = migration. unwrap ( ) ;
82- assert_eq ! ( migration. timestamp , 1234567890 ) ;
83- assert_eq ! ( migration. name, "create_users.sql " ) ;
87+ assert_eq ! ( migration. sequence_number , 1234567890 ) ;
88+ assert_eq ! ( migration. name, "create_users" ) ;
8489 }
8590
8691 #[ test]
@@ -96,10 +101,25 @@ mod tests {
96101
97102 assert ! ( migration. is_some( ) ) ;
98103 let migration = migration. unwrap ( ) ;
99- assert_eq ! ( migration. timestamp , 1234567890 ) ;
104+ assert_eq ! ( migration. sequence_number , 1234567890 ) ;
100105 assert_eq ! ( migration. name, "create_users" ) ;
101106 }
102107
108+ #[ test]
109+ fn test_get_migration_prefix_number ( ) {
110+ let temp_dir = setup ( ) ;
111+ let migrations_dir = temp_dir. path ( ) . to_path_buf ( ) ;
112+ let path = migrations_dir. join ( "000201_a_migration.sql" ) ;
113+ fs:: write ( & path, "" ) . unwrap ( ) ;
114+
115+ let migration = get_migration ( & path, & migrations_dir) ;
116+
117+ assert ! ( migration. is_some( ) ) ;
118+ let migration = migration. unwrap ( ) ;
119+ assert_eq ! ( migration. sequence_number, 201 ) ;
120+ assert_eq ! ( migration. name, "a_migration" ) ;
121+ }
122+
103123 #[ test]
104124 fn test_get_migration_not_timestamp_in_filename ( ) {
105125 let migrations_dir = PathBuf :: from ( "/tmp/migrations" ) ;
0 commit comments