@@ -8,7 +8,7 @@ use std::{fs, mem, panic};
88
99use crossbeam_channel:: Sender ;
1010use fun_time:: fun_time;
11- use log:: debug;
11+ use log:: { debug, error } ;
1212use pdf:: PdfError ;
1313use pdf:: PdfError :: Try ;
1414use pdf:: file:: FileOptions ;
@@ -458,15 +458,15 @@ fn check_extension_availability(
458458 audio_extensions : & HashSet < & & ' static str > ,
459459 pdf_extensions : & HashSet < & & ' static str > ,
460460) -> TypeOfFile {
461- let Some ( extension) = full_name. extension ( ) else {
462- debug_assert ! ( false , "Missing extension" ) ;
461+ let Some ( file_name) = full_name. file_name ( ) else {
462+ error ! ( "Missing file name in file - \" {}\" " , full_name. to_string_lossy( ) ) ;
463+ debug_assert ! ( false , "Missing file name in file - \" {}\" " , full_name. to_string_lossy( ) ) ;
463464 return TypeOfFile :: Unknown ;
464465 } ;
466+ let Some ( file_name_str) = file_name. to_str ( ) else { return TypeOfFile :: Unknown } ;
467+ let Some ( extension_idx) = file_name_str. rfind ( '.' ) else { return TypeOfFile :: Unknown } ;
468+ let extension_str = & file_name_str[ extension_idx + 1 ..] ;
465469
466- let Some ( extension_str) = extension. to_str ( ) else {
467- debug_assert ! ( false , "Extension not really fully str" ) ;
468- return TypeOfFile :: Unknown ;
469- } ;
470470 let extension_lowercase = extension_str. to_ascii_lowercase ( ) ;
471471
472472 if images_extensions. contains ( & extension_lowercase. as_str ( ) ) {
@@ -478,8 +478,8 @@ fn check_extension_availability(
478478 } else if pdf_extensions. contains ( & extension_lowercase. as_str ( ) ) {
479479 TypeOfFile :: PDF
480480 } else {
481- eprintln ! ( "File with unknown extension: \" {}\" - {extension_lowercase}" , full_name. to_string_lossy( ) ) ;
482- debug_assert ! ( false , "File with unknown extension" ) ;
481+ error ! ( "File with unknown extension: \" {}\" - {extension_lowercase}" , full_name. to_string_lossy( ) ) ;
482+ debug_assert ! ( false , "File with unknown extension - \" {} \" - {extension_lowercase}" , full_name . to_string_lossy ( ) ) ;
483483 TypeOfFile :: Unknown
484484 }
485485}
@@ -520,3 +520,95 @@ impl CommonData for BrokenFiles {
520520 & mut self . common_data
521521 }
522522}
523+
524+ #[ cfg( test) ]
525+ mod tests {
526+ use std:: collections:: HashSet ;
527+ use std:: path:: Path ;
528+
529+ use super :: * ;
530+
531+ #[ test]
532+ fn test_check_extension_availability_image ( ) {
533+ let images_extensions: HashSet < & & str > = [ "jpg" , "png" , "gif" ] . iter ( ) . collect ( ) ;
534+ let zip_extensions: HashSet < & & str > = HashSet :: new ( ) ;
535+ let audio_extensions: HashSet < & & str > = HashSet :: new ( ) ;
536+ let pdf_extensions: HashSet < & & str > = HashSet :: new ( ) ;
537+
538+ let path = Path :: new ( "test.jpg" ) ;
539+ assert_eq ! (
540+ check_extension_availability( path, & images_extensions, & zip_extensions, & audio_extensions, & pdf_extensions) ,
541+ TypeOfFile :: Image
542+ ) ;
543+ }
544+
545+ #[ test]
546+ fn test_check_extension_availability_zip ( ) {
547+ let images_extensions: HashSet < & & str > = HashSet :: new ( ) ;
548+ let zip_extensions: HashSet < & & str > = [ "zip" , "rar" ] . iter ( ) . collect ( ) ;
549+ let audio_extensions: HashSet < & & str > = HashSet :: new ( ) ;
550+ let pdf_extensions: HashSet < & & str > = HashSet :: new ( ) ;
551+
552+ let path = Path :: new ( "test.zip" ) ;
553+ assert_eq ! (
554+ check_extension_availability( path, & images_extensions, & zip_extensions, & audio_extensions, & pdf_extensions) ,
555+ TypeOfFile :: ArchiveZip
556+ ) ;
557+ }
558+
559+ #[ test]
560+ fn test_check_extension_availability_audio ( ) {
561+ let images_extensions: HashSet < & & str > = HashSet :: new ( ) ;
562+ let zip_extensions: HashSet < & & str > = HashSet :: new ( ) ;
563+ let audio_extensions: HashSet < & & str > = [ "mp3" , "wav" ] . iter ( ) . collect ( ) ;
564+ let pdf_extensions: HashSet < & & str > = HashSet :: new ( ) ;
565+
566+ let path = Path :: new ( "test.mp3" ) ;
567+ assert_eq ! (
568+ check_extension_availability( path, & images_extensions, & zip_extensions, & audio_extensions, & pdf_extensions) ,
569+ TypeOfFile :: Audio
570+ ) ;
571+ }
572+
573+ #[ test]
574+ fn test_check_extension_availability_pdf ( ) {
575+ let images_extensions: HashSet < & & str > = HashSet :: new ( ) ;
576+ let zip_extensions: HashSet < & & str > = HashSet :: new ( ) ;
577+ let audio_extensions: HashSet < & & str > = HashSet :: new ( ) ;
578+ let pdf_extensions: HashSet < & & str > = std:: iter:: once ( & "pdf" ) . collect ( ) ;
579+
580+ let path = Path :: new ( "test.pdf" ) ;
581+ assert_eq ! (
582+ check_extension_availability( path, & images_extensions, & zip_extensions, & audio_extensions, & pdf_extensions) ,
583+ TypeOfFile :: PDF
584+ ) ;
585+ }
586+
587+ #[ test]
588+ fn test_check_extension_availability_no_extension ( ) {
589+ let images_extensions: HashSet < & & str > = HashSet :: new ( ) ;
590+ let zip_extensions: HashSet < & & str > = HashSet :: new ( ) ;
591+ let audio_extensions: HashSet < & & str > = HashSet :: new ( ) ;
592+ let pdf_extensions: HashSet < & & str > = HashSet :: new ( ) ;
593+
594+ let path = Path :: new ( "test" ) ;
595+ assert_eq ! (
596+ check_extension_availability( path, & images_extensions, & zip_extensions, & audio_extensions, & pdf_extensions) ,
597+ TypeOfFile :: Unknown
598+ ) ;
599+ }
600+
601+ #[ test]
602+ fn test_check_no_extension ( ) {
603+ let images_extensions: HashSet < & & str > = HashSet :: new ( ) ;
604+ let zip_extensions: HashSet < & & str > = HashSet :: new ( ) ;
605+ let audio_extensions: HashSet < & & str > = [ "mp3" , "wav" ] . iter ( ) . collect ( ) ;
606+ let pdf_extensions: HashSet < & & str > = HashSet :: new ( ) ;
607+
608+ let path = Path :: new ( "/home/.mp3" ) ;
609+ assert_eq ! (
610+ check_extension_availability( path, & images_extensions, & zip_extensions, & audio_extensions, & pdf_extensions) ,
611+ TypeOfFile :: Audio
612+ ) ;
613+ }
614+ }
0 commit comments