use reqwest::blocking::Client;
use std::fs::{File, OpenOptions};
use std::io::{self, Read, Write};
use std::path::Path;
pub fn file_exists(path : &str) -> bool {
let file_path = Path::new(path);
if file_path.exists() {
return true;
}
return false;
}
pub fn create_file(content: String, output_path: &str) -> Result<(), Box<dyn std::error::Error>> {
ensure_folder_exists(output_path)?;
let mut file = File::create(output_path)?;
file.write_all(content.as_bytes())?;
Ok(())
}
pub fn append_to_file(file_path: &str, content: &str) -> io::Result<()> {
let mut file = OpenOptions::new()
.append(true)
.create(true) .open(file_path)?;
writeln!(file, "{}", content)?;
Ok(())
}
pub fn upload_file_from_cb<F>(
from_path: &str,
to_path: &str,
file_name: &str,
callback: F,
) -> Result<(), Box<dyn std::error::Error>>
where
F: Fn(f64),
{
let client = Client::new();
let mut response = client.get(from_path).send()?;
let total_size = response
.content_length()
.ok_or("Failed to get content length")?;
ensure_folder_exists(to_path)?;
let file_path = format!("{}{}", to_path, file_name);
let mut file = File::create(file_path)?;
let mut downloaded: u64 = 0;
let mut buffer = [0; 8192];
loop {
let bytes_read = response.read(&mut buffer)?;
if bytes_read == 0 {
break; }
file.write_all(&buffer[..bytes_read])?;
downloaded += bytes_read as u64;
let progress = (downloaded as f64 / total_size as f64) * 100.0;
callback(progress);
}
Ok(())
}
pub fn upload_file_from(
from_path: &str,
to_path: &str,
file_name: &str,
) -> Result<(), Box<dyn std::error::Error>> {
upload_file_from_cb(from_path, to_path, file_name, |_| {})
}
pub fn delete_file(target_path: impl AsRef<str>) -> io::Result<()> {
let path = target_path.as_ref();
std::fs::remove_file(path)?;
Ok(())
}
pub fn delete_folder(target_path: impl AsRef<str>) -> io::Result<()> {
let path = target_path.as_ref();
std::fs::remove_dir_all(path)?;
Ok(())
}
pub fn delete_fof(target_path: impl AsRef<str>) -> io::Result<()> {
let path = Path::new(target_path.as_ref());
if path.is_dir() {
std::fs::remove_dir_all(path)?;
} else if path.is_file() {
std::fs::remove_file(path)?;
} else {
return Err(io::Error::new(io::ErrorKind::NotFound, "Fichier ou dossier introuvable").into());
}
Ok(())
}
fn ensure_folder_exists(folder_path: impl AsRef<str>) -> io::Result<()> {
let path = folder_path.as_ref();
let path = Path::new(path);
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
match upload_file_from(
"https://server11.mp3quran.net/hazza/001.mp3",
"../uploads/audio",
"001.mp3"
) {
Ok(_) => {
println!("Fichier téléchargé avec succès !")
}
Err(e) => eprintln!("Erreur : {}", e),
}
match upload_file_from_cb(
"https://server11.mp3quran.net/hazza/013.mp3",
"../uploads/audio",
"013.mp3",
|progress| {println!("progression : {}%", progress)}
) {
Ok(_) => {
println!("Fichier téléchargé avec succès !")
}
Err(e) => eprintln!("Erreur : {}", e),
}
match create_file(
String::from("hello wordl"),
"../uploads/testDeCreation/001.txt"
) {
Ok(_) => {
println!("Fichier crée avec succès !")
}
Err(e) => eprintln!("Erreur : {}", e),
}
append_to_file("../uploads/testDeCreation/001.txt", "\n du texte en plus \n").expect("Error");
let file_exists = file_exists("../uploads/testDeCreation/001.txt");
println!("file is present ? -> {file_exists}");
}
}