@@ -18,47 +18,40 @@ fn get_timestamp() -> u64 {
18
18
. as_secs ( )
19
19
}
20
20
21
- fn extend_dir ( path : & Path , time : u64 ) -> PathBuf {
22
- let dir = match path. file_name ( ) {
23
- Some ( dir_name) => dir_name. to_string_lossy ( ) . to_string ( ) ,
24
- None => "directory" . to_string ( ) ,
25
- } ;
26
- match path. parent ( ) {
27
- Some ( parent_path) => parent_path. join ( format ! ( "{}_{}" , dir, time) ) ,
28
- // Probably not best idea to use this application to move your whole root dir (。•̀ᴗ-)
29
- None => Path :: new ( & format ! ( "/directory_{}" , time) ) . to_path_buf ( ) ,
30
- }
21
+ fn extend_dir ( path : & Path , dir_name : & str , time : u64 ) -> PathBuf {
22
+ path. join ( format ! ( "{}_{}" , dir_name, time) )
31
23
}
32
24
33
- fn extend_file ( path : & Path , time : u64 ) -> PathBuf {
34
- let extension: String = match path. extension ( ) {
25
+ fn extend_file ( path : & Path , name : & str , time : u64 ) -> PathBuf {
26
+ let file_name_path = Path :: new ( name) ;
27
+ let extension: String = match file_name_path. extension ( ) {
35
28
Some ( v) => v. to_string_lossy ( ) . to_string ( ) ,
36
29
None => "" . to_string ( ) ,
37
30
} ;
38
- let basename = match path . file_stem ( ) {
31
+ let basename = match file_name_path . file_stem ( ) {
39
32
Some ( v) => v. to_string_lossy ( ) . to_string ( ) ,
40
33
None => "file" . to_string ( ) ,
41
34
} ;
42
- let name = format ! ( "{}_{}" , basename, time) ;
43
- let mut path = path. join ( & name ) ;
35
+ let new_name = format ! ( "{}_{}" , basename, time) ;
36
+ let mut path = path. join ( & new_name ) ;
44
37
path. set_extension ( extension) ;
45
38
path
46
39
}
47
40
48
- fn generate_full_path < F > ( name : & str , path : & Path , timestamp : F ) -> Result < String , Error >
41
+ fn generate_full_path < F > ( path : & Path , name : & str , timestamp : F ) -> Result < String , Error >
49
42
where
50
43
F : Fn ( ) -> u64 ,
51
44
{
52
45
// If file or dir already exists in the target directory, create a path extended with a timestamp
53
- let path = Path :: new ( & path) ;
54
46
let joined = path. join ( & name) ;
55
47
let time = timestamp ( ) ;
56
48
57
49
let joined = if joined. exists ( ) {
50
+ info ! ( "File already exists: {:?}" , joined) ;
58
51
if joined. is_file ( ) {
59
- extend_file ( & joined , time)
52
+ extend_file ( path , name , time)
60
53
} else {
61
- extend_dir ( & joined , time)
54
+ extend_dir ( path , name , time)
62
55
}
63
56
} else {
64
57
joined
@@ -76,12 +69,12 @@ pub fn get_target_path(name: &str, target_path: Option<&String>) -> Result<Strin
76
69
match target_path {
77
70
Some ( path) => {
78
71
let path = Path :: new ( path) ;
79
- generate_full_path ( name , path , get_timestamp)
72
+ generate_full_path ( path , name , get_timestamp)
80
73
}
81
74
None => {
82
75
let config = UserConfig :: new ( ) ?;
83
76
let dir = config. get_downloads_dir ( ) ;
84
- generate_full_path ( name , dir. as_path ( ) , get_timestamp)
77
+ generate_full_path ( dir. as_path ( ) , name , get_timestamp)
85
78
}
86
79
}
87
80
}
@@ -208,34 +201,51 @@ impl UserConfig {
208
201
#[ cfg( test) ]
209
202
mod tests {
210
203
use crate :: user_data:: { extend_dir, generate_full_path} ;
204
+ use std:: fs:: { create_dir_all, File } ;
211
205
use std:: path:: Path ;
206
+ use tempfile:: tempdir;
212
207
213
208
#[ test]
214
209
fn test_extend_dir_should_extend_name_with_timestamp ( ) {
215
- let result = extend_dir ( Path :: new ( "/home/user/directory/" ) , 1111 ) ;
210
+ let result = extend_dir ( Path :: new ( "/home/user/" ) , "directory" , 1111 ) ;
216
211
217
212
assert_eq ! ( result, Path :: new( "/home/user/directory_1111" ) )
218
213
}
219
214
220
215
#[ test]
221
- fn test_extend_dir_root_edge_case ( ) {
222
- let result = extend_dir ( Path :: new ( "/" ) , 1111 ) ;
216
+ fn test_generate_full_file_path ( ) {
217
+ let result = generate_full_path ( Path :: new ( "/home/user/ " ) , "a-file.txt" , || 1111 ) . unwrap ( ) ;
223
218
224
- assert_eq ! ( result, Path :: new ( "/directory_1111" ) )
219
+ assert_eq ! ( result, "/home/user/a-file.txt" ) ;
225
220
}
226
221
227
222
#[ test]
228
- fn test_generate_full_file_path ( ) {
229
- let result = generate_full_path ( "a-file.txt" , Path :: new ( "/home/user/" ) , || 1111 ) . unwrap ( ) ;
223
+ fn test_generate_full_file_path_when_file_exists ( ) {
224
+ let dir = tempdir ( ) . unwrap ( ) ;
225
+ let path = dir. path ( ) ;
226
+ let received_file_name = "a-file.txt" ;
227
+ File :: create ( path. join ( received_file_name) ) . unwrap ( ) ;
230
228
231
- assert_eq ! ( result, "/home/user/a-file.txt" ) ;
229
+ let result = generate_full_path ( path, received_file_name, || 1111 ) . unwrap ( ) ;
230
+
231
+ assert_eq ! ( result, path. join( "a-file_1111.txt" ) . to_string_lossy( ) ) ;
232
232
}
233
233
234
234
#[ test]
235
235
fn test_generate_full_dir_path ( ) {
236
236
let result =
237
- generate_full_path ( "some_directory" , Path :: new ( "/home/user/" ) , || 1111 ) . unwrap ( ) ;
237
+ generate_full_path ( Path :: new ( "/home/user/" ) , "some_directory" , || 1111 ) . unwrap ( ) ;
238
238
239
239
assert_eq ! ( result, "/home/user/some_directory" ) ;
240
240
}
241
+ #[ test]
242
+ fn test_generate_full_dir_path_when_dir_exists ( ) {
243
+ let dir = tempdir ( ) . unwrap ( ) ;
244
+ let path = dir. path ( ) ;
245
+ let received_dir_name = "some_directory" ;
246
+ create_dir_all ( path. join ( received_dir_name) ) . unwrap ( ) ;
247
+ let result = generate_full_path ( path, received_dir_name, || 1111 ) . unwrap ( ) ;
248
+
249
+ assert_eq ! ( result, path. join( "some_directory_1111" ) . to_string_lossy( ) ) ;
250
+ }
241
251
}
0 commit comments