use std::{fs::{self, File}, env, path::Path, io::{self, Write}};
#[allow(non_camel_case_types)]
pub struct neologFile {
file: File,
logging_level: i32
}
pub fn init(file: &str, level: Option<&str>) -> Result<neologFile, io::Error> {
let logfile = Path::new(&env::current_dir().unwrap()).join(file);
match fs::metadata(logfile.clone()){
Ok(_) => (),
Err(_) => {
match fs::File::create(logfile.clone()){
Ok(_) => (),
Err(e) => {
eprintln!("neolog error: {}", e);
return Err(e)
}
}
},
};
let file = match fs::OpenOptions::new().append(true).open(logfile.clone()){
Ok(f) => f,
Err(e) => {
eprintln!("neolog error: {}", e);
return Err(e)
}
};
let logging_level: i32 = match level.unwrap_or("debug").to_lowercase().as_str() {
"debug" => 2, "critical" => 4, "error" => 3, "all" => 1, "verbose" => 1,
_ => 2, };
return Ok(neologFile{file, logging_level})
}
fn log(message: String, mut fileref: neologFile) -> Result<neologFile, io::Error> {
match fileref.file.write_all(&message.as_bytes()) {
Ok(_) => return Ok(fileref),
Err(e) => return Err(e),
}
}
pub fn debug(mut message: String, logfile: neologFile) -> Result<neologFile, io::Error> {
let line_number = line!();
message = format!("DEBUG (line {}): {}", line_number, message);
if logfile.logging_level <= 2 {
match log(message, logfile){
Ok(o) => Ok(o),
Err(e) => Err(e)
}
}
else {
Ok(logfile)
}
}
pub fn critical(mut message: String, logfile: neologFile) -> Result<neologFile, io::Error> {
let line_number = line!();
message = format!("## CRITICAL ERROR at line {} ##\n{}\n### ###", line_number, message);
if logfile.logging_level <= 2 {
match log(message, logfile){
Ok(o) => Ok(o),
Err(e) => Err(e)
}
}
else {
Ok(logfile)
}
}
pub fn error(mut message: String, logfile: neologFile) -> Result<neologFile, io::Error> {
let line_number = line!();
message = format!("## ERROR at line {} ##: {}", line_number, message);
if logfile.logging_level <= 2 {
match log(message, logfile){
Ok(o) => Ok(o),
Err(e) => Err(e)
}
}
else {
Ok(logfile)
}
}
pub fn info(message: String, logfile: neologFile) -> Result<neologFile, io::Error> {
if logfile.logging_level <= 2 {
match log(message, logfile){
Ok(o) => Ok(o),
Err(e) => Err(e)
}
}
else {
Ok(logfile)
}
}