zeke 0.1.6

a http library for rust built on top of tokio
Documentation
use std::{fs::{self, OpenOptions}, path::Path};
use std::io::Write;

#[derive(Debug, Clone,)]
pub enum Logs {
	Trace,
	ServerError,
    HttpTest,
	Debug,
	FuzzFail,
}

impl Logs {
    pub fn as_str(&self) -> &'static str {
        match *self {
			Logs::Trace => "trace.log",
			Logs::ServerError => "error.log",
            Logs::HttpTest => "test.log",
			Logs::Debug => "debug.log",
			Logs::FuzzFail => "fuzz_fail.log",
        }
    }
}

impl Copy for Logs {}

#[derive(Debug, Clone)]
pub struct Logger {
	log_root_dir: String,
	spawn_time: std::time::Instant,
	last_logged: std::time::Instant,
}
impl Logger {
	pub fn new() -> Self {
		Self {
			log_root_dir: "logs".to_string(),
			spawn_time: std::time::Instant::now(),
			last_logged: std::time::Instant::now(),
		}
	}
	pub fn reset_log(&self, file_name: Logs) {
		let file_path = format!("{}/{}", self.log_root_dir, file_name.as_str());
		let directory = Path::new(&self.log_root_dir);
		if !directory.exists() {
			fs::create_dir_all(directory).expect("Unable to create directory");
		}
		let mut file = OpenOptions::new()
			.create(true)
			.write(true)
			.truncate(true)
			.open(&file_path)
			.expect("Unable to open file");
		writeln!(file, "").expect("Unable to write to file");
	}
    pub fn elapsed(&self) -> String {
        let elapsed = self.spawn_time.elapsed();
		let micros = elapsed.as_micros();
		if micros < 1000 {
			return format!("{}µs", micros);
		}
		let millis = elapsed.as_millis();
		if millis < 1000 {
			return format!("{}ms", millis);
		}
		let seconds = elapsed.as_secs();
		if seconds < 60 {
			return format!("{}s", seconds);
		}
		return format!("{}ms", millis);

    }
	pub fn logged(&self) -> std::time::Duration {
		self.last_logged.elapsed()
	}
    pub fn log(&self, file_name: Logs, message: &str) {
        let file_path = format!("{}/{}", self.log_root_dir, file_name.as_str());
        let directory = Path::new(&self.log_root_dir);
        if !directory.exists() {
            fs::create_dir_all(directory).expect("Unable to create directory");
        }
        let mut file = OpenOptions::new()
            .create(true)
            .write(true)
            .append(true)
            .open(&file_path)
            .expect("Unable to open file");
        writeln!(file, "{:?}: {}", self.elapsed(), message).expect("Unable to write to file");
		writeln!(file, "\n").expect("Unable to write to file");
    }
    pub fn http(&self, file_name: Logs, label: &str, req: &String, res: &String) {
        let file_path = format!("{}/{}", self.log_root_dir, file_name.as_str());
        let directory = Path::new(&self.log_root_dir);
        if !directory.exists() {
            fs::create_dir_all(directory).expect("Unable to create directory");
        }
        let mut file = OpenOptions::new()
            .create(true)
            .write(true)
            .append(true)
            .open(&file_path)
            .expect("Unable to open file");
    
        writeln!(file, "{:?}: {}", self.elapsed(), label).expect("Unable to write to file");
		writeln!(file, "\treq: {:?}", req).expect("Unable to write to file");
		writeln!(file, "\tres: {:?}", res).expect("Unable to write to file");
        writeln!(file, "\n").expect("Unable to write to file");
    }
    pub fn dbg(&self, message: &str) {
        let file_path = format!("{}/{}", self.log_root_dir, Logs::Debug.as_str());
        let directory = Path::new(&self.log_root_dir);
        if !directory.exists() {
            fs::create_dir_all(directory).expect("Unable to create directory");
        }
        let mut file = OpenOptions::new()
            .create(true)
            .write(true)
            .append(true)
            .open(&file_path)
            .expect("Unable to open file");
        writeln!(file, "{:?}: {}", self.elapsed(), message).expect("Unable to write to file");
		writeln!(file, "\n").expect("Unable to write to file");
    }
}