@@ -2,20 +2,13 @@ use std::env;
22use std:: fs:: File ;
33use std:: io:: Write ;
44use std:: path:: { Path , PathBuf } ;
5- use std:: time:: Instant ;
5+ use std:: time:: { Duration , Instant } ;
66use std:: collections:: HashMap ;
77use rmp_serde:: encode;
88use walkdir:: WalkDir ;
99
10- fn format_file_size ( size : u64 , unit : & str ) -> String {
11- match unit {
12- "o" => format ! ( "{} octets" , size) ,
13- "Ko" => format ! ( "{:.2} Ko" , size as f64 / 1024.0 ) ,
14- "Mo" => format ! ( "{:.2} Mo" , size as f64 / ( 1024.0 * 1024.0 ) ) ,
15- "Go" => format ! ( "{:.2} Go" , size as f64 / ( 1024.0 * 1024.0 * 1024.0 ) ) ,
16- _ => format ! ( "{} octets" , size) ,
17- }
18- }
10+ mod yadm;
11+ use yadm:: report:: report:: Report ;
1912
2013fn scan_dir ( path : & Path ) -> Vec < PathBuf > {
2114 WalkDir :: new ( path)
@@ -27,8 +20,8 @@ fn scan_dir(path: &Path) -> Vec<PathBuf> {
2720}
2821
2922fn parsing_to_hashmap ( entries : & [ PathBuf ] ) -> Vec < HashMap < String , String > > {
30- entries. iter ( ) . map ( |entry| {
31- let mut hashmap = HashMap :: new ( ) ;
23+ entries. iter ( ) . map ( |entry : & PathBuf | {
24+ let mut hashmap: HashMap < String , String > = HashMap :: new ( ) ;
3225 hashmap. insert ( "name" . to_string ( ) , entry. file_name ( ) . unwrap_or_default ( ) . to_string_lossy ( ) . into_owned ( ) ) ;
3326 hashmap. insert ( "ext" . to_string ( ) , entry. extension ( ) . unwrap_or_default ( ) . to_string_lossy ( ) . into_owned ( ) ) ;
3427 hashmap. insert ( "path" . to_string ( ) , entry. to_string_lossy ( ) . into_owned ( ) ) ;
@@ -44,34 +37,56 @@ fn main() {
4437 std:: process:: exit ( 1 ) ;
4538 }
4639
47- let target_dir = & args[ 1 ] ;
40+ let target_dir: & String = & args[ 1 ] ;
41+
4842 println ! ( "1. Scanning folders at: {}" , target_dir) ;
43+ let scan_start: Instant = Instant :: now ( ) ;
44+ let paths: Vec < PathBuf > = scan_dir ( Path :: new ( target_dir) ) ;
45+ let scan_duration: Duration = scan_start. elapsed ( ) ;
4946
50- let start_time = Instant :: now ( ) ;
51- let paths = scan_dir ( Path :: new ( target_dir) ) ;
52- let end_time = start_time. elapsed ( ) ;
47+ let total_files: u64 =
48+ if paths. is_empty ( ) {
49+ eprintln ! ( "No files found. Exiting." ) ;
50+ return ;
51+ } else {
52+ let count = paths. len ( ) as u64 ;
53+ println ! ( "Found {} files" , count) ;
54+ count
55+ } ;
5356
54- println ! ( "Time taken: {:?}" , end_time) ;
55- println ! ( "Elements found: {:?}" , paths. len( ) ) ;
5657
57- if !paths. is_empty ( ) {
58- let medium_time_per_element = end_time. as_nanos ( ) / paths. len ( ) as u128 ;
59- println ! ( "Medium time by element: {:?} ns" , medium_time_per_element) ;
60- } else {
61- println ! ( "No elements found, cannot calculate medium time by element." ) ;
62- }
58+ println ! ( "2. Parsing to hashmap..." ) ;
59+ let hashmap_parsing_start: Instant = Instant :: now ( ) ;
60+ let hashmap: Vec < HashMap < String , String > > = parsing_to_hashmap ( & paths) ;
61+ let hashmap_parsing_duration: Duration = hashmap_parsing_start. elapsed ( ) ;
62+
6363
64- let hashmap = parsing_to_hashmap ( & paths ) ;
65- let encoded = encode :: to_vec ( & hashmap ) . unwrap ( ) ;
64+ println ! ( "3. Encoding + writing MessagePack..." ) ;
65+ let msgpack_parsing_start = Instant :: now ( ) ;
6666
67- let mut file = File :: create ( "output.msgpack" ) . expect ( "Impossible de créer le fichier" ) ;
67+ let encoded: Vec < u8 > = encode:: to_vec ( & hashmap) . unwrap ( ) ;
68+ let mut file: File = File :: create ( "output.msgpack" ) . expect ( "Impossible de créer le fichier" ) ;
6869 file. write_all ( & encoded) . expect ( "Impossible d'écrire dans le fichier" ) ;
6970
70- let metadata = file. metadata ( ) . expect ( "Impossible d'obtenir les métadonnées du fichier" ) ;
71- let file_size = metadata. len ( ) ;
71+ let msgpack_parsing_duration: Duration = msgpack_parsing_start. elapsed ( ) ;
7272
73- println ! ( "Taille du fichier : {}" , format_file_size( file_size, "o" ) ) ;
74- println ! ( "Taille du fichier : {}" , format_file_size( file_size, "Ko" ) ) ;
75- println ! ( "Taille du fichier : {}" , format_file_size( file_size, "Mo" ) ) ;
76- println ! ( "Taille du fichier : {}" , format_file_size( file_size, "Go" ) ) ;
77- }
73+ let metadata: std:: fs:: Metadata = file. metadata ( ) . expect ( "Impossible d'obtenir les métadonnées du fichier" ) ;
74+ let file_size: u64 = metadata. len ( ) ;
75+
76+ let report: Report = Report {
77+ target : args[ 0 ] . clone ( ) ,
78+ scan_start_at : scan_start,
79+ scan_duration : scan_duration,
80+ elements_found : file_size,
81+ hashmap_parsing_start_at : hashmap_parsing_start,
82+ hashmap_parsing_duration : hashmap_parsing_duration,
83+ msgpack_parsing_start_at : msgpack_parsing_start,
84+ msgpack_parsing_duration : msgpack_parsing_duration,
85+ output_file_size : file_size,
86+ full_duration : scan_duration+hashmap_parsing_duration+msgpack_parsing_duration,
87+ average_duration_by_file : file_size. checked_div ( scan_duration. as_secs ( ) +hashmap_parsing_duration. as_secs ( ) +msgpack_parsing_duration. as_secs ( ) ) . unwrap_or ( 0 ) ,
88+ average_size_by_file : file_size. checked_div ( total_files) . unwrap_or ( 0 ) ,
89+ } ;
90+
91+ println ! ( "{}" , report)
92+ }
0 commit comments