#![allow(unused)]
use std::io::ErrorKind;
use std::fs::{File, Metadata};
use std::{fs, process, fs::metadata, io::Error, thread, path::Path, path::PathBuf, env, time};
use std::env::{current_dir, set_current_dir};
use std::mem::drop;
use log;
pub fn entry(path:&PathBuf, size: Option<&String>)-> Result<(),Error> {
log::info!("๐sizer initialized at {} ๐", path.as_os_str().to_str().unwrap());
thread::sleep(time::Duration::from_millis(1000));
let now = time::Instant::now();
if fs::read_dir(path).is_ok() {
let dir = fs::read_dir(path).expect("{file:?} failed to open");
let (spawn, main):(Vec<_>, Vec<_>) = dir.enumerate().partition(|(i,_)| i%2 ==0);
let filter = match size.is_none(){
true => 100,
false => size.unwrap().parse::<i64>().unwrap() };
log::info!("๐you are filtering with {filter} mb๐");
let spawn_size = filter.clone();
let handle = thread::spawn(move||{
for (index,files) in spawn {
let meta_data = files.as_ref().unwrap().metadata().unwrap();
let file = files.as_ref().unwrap().path();
match meta_data.is_dir() {
true => {
subfolders_recur(&file, spawn_size )
},
false => {
let large_file = run_command(&meta_data, &file, spawn_size);
}
}
}
thread::sleep(time::Duration::from_millis(5));
});
for (index,files) in main {
let meta_data = files.as_ref().unwrap().metadata().unwrap();
let file = &files.as_ref().unwrap().path();
match meta_data.is_dir() {
true => {
subfolders_recur(&file, filter)
},
false => {
let _ = run_command(&meta_data, file, filter);
}
}
}
handle.join();
let finished = now.elapsed().as_secs();
log::info!("๐ finished succesfully in {} seconds ๐", finished);
Ok(())
}else{
let error = fs::read_dir(path).unwrap_err();
log::error!("{:?}", error.to_string());
Err(error)
}
}
fn subfolders_recur(args: &PathBuf, size: i64){
if fs::read_dir(&args).is_ok() {
for files in fs::read_dir(&args).expect("msg"){
let meta_data = files.as_ref().unwrap().metadata();
match meta_data {
Ok(data) => (),
Err(error) => {
match error.kind(){
ErrorKind::PermissionDenied => continue,
err => log::error!("{err:?}")
}
}
}
let meta_data = files.as_ref().unwrap().metadata();
match meta_data {
Ok(_) => (),
Err(err) => {
match err.raw_os_error().unwrap() == 9 {
true => continue,
false => {
log::error!("{:?}", err.to_string());
process::exit(1);
}
}
}
}
let file = &files.as_ref().unwrap().path();
let meta_data = files.as_ref().unwrap().metadata().unwrap();
match meta_data.is_dir(){
true =>{
let file = &files.unwrap().path();
let _ = subfolders_recur(file, size);
},
false => {
let file = run_command(&meta_data, &file, size);
}
}
}
}
}
fn run_command<'a>(meta_data: &Metadata, file: & 'a PathBuf, filter:i64)-> Option<(& 'a PathBuf, f64)>{
let size = meta_data.len();
let x = file.as_os_str().to_str().unwrap();
if size < 1024*1024 {
}
else {
let size_in_mb = size as f64 / (1024 * 1024) as f64;
if filter != 100 {
if size as f64 > (filter * 1024 * 1024) as f64{
log::debug!("โ
{}: {:.2}MB", x, size_in_mb);
return Some((file, size_in_mb))
}
}else{
if size as f64 > (100 * 1024 * 1024) as f64{
log::debug!("โ
{}: {:.2}MB", x, size_in_mb);
return Some((file, size_in_mb))
}
}
}
None
}
#[test]
fn test_read_directory_and_iterate() {
let path = PathBuf::from(".");
let size = None;
let value = entry(&path, size);
assert!(value.is_ok())
}
#[test]
fn test_filter_files_based_on_size() {
let path = PathBuf::from(".");
let size = Some(String::from("50"));
let result = entry(&path, size.as_ref());
assert!(result.is_ok())
}
#[test]
fn test_log_messages_correctly() {
let path = PathBuf::from(".");
let size = None;
let result = entry(&path, size);
assert!(result.is_ok())
}
#[test]
fn test_directory_not_exist_logs_error_and_exits() {
let path = PathBuf::from("nonexistent/directory");
let size = None;
let result = entry(&path, size);
assert!(result.is_err())
}
#[test]
fn test_metadata_cannot_be_accessed_continues_iterating() {
let path = PathBuf::from(".");
let size = None;
let result = entry(&path, size);
assert!(result.is_ok())
}