#![allow(dead_code)]
use std::process;
use crate::prelude::Metadata;
use super::{displayer::Displayer, ErrorDetails};
#[derive(Clone)]
pub enum LogType {
Error,
Warning,
Info
}
pub struct Logger {
pub kind: LogType,
pub trace: Vec<ErrorDetails>,
pub code: Option<String>,
pub message: Option<String>,
pub comment: Option<String>
}
impl Logger {
pub fn new(code: Option<&String>, trace: &[ErrorDetails], kind: LogType) -> Self {
Logger {
kind,
trace: trace.iter().rev().cloned().collect(),
code: code.cloned(),
message: None,
comment: None
}
}
pub fn new_msg(message: impl AsRef<str>, kind: LogType) -> Self {
Logger {
kind,
trace: vec![],
code: None,
message: Some(message.as_ref().to_string()),
comment: None
}
}
pub fn new_err_msg(message: impl AsRef<str>) -> Self {
Logger::new_msg(message, LogType::Error)
}
pub fn new_warn_msg(message: impl AsRef<str>) -> Self {
Logger::new_msg(message, LogType::Warning)
}
pub fn new_info_msg(message: impl AsRef<str>) -> Self {
Logger::new_msg(message, LogType::Info)
}
pub fn new_err_with_trace(meta: &impl Metadata, trace: &[ErrorDetails]) -> Self {
Logger::new(meta.get_code(), trace, LogType::Error)
}
pub fn new_warn_with_trace(meta: &impl Metadata, trace: &[ErrorDetails]) -> Self {
Logger::new(meta.get_code(), trace, LogType::Warning)
}
pub fn new_info_with_trace(meta: &impl Metadata, trace: &[ErrorDetails]) -> Self {
Logger::new(meta.get_code(), trace, LogType::Info)
}
pub fn new_err_at_position(meta: &impl Metadata, loc: (usize, usize)) -> Self {
Logger::new(meta.get_code(), &[ErrorDetails::with_pos(meta.get_path(), loc, 0)], LogType::Error)
}
pub fn new_warn_at_position(meta: &impl Metadata, loc: (usize, usize)) -> Self {
Logger::new(meta.get_code(), &[ErrorDetails::with_pos(meta.get_path(), loc, 0)], LogType::Warning)
}
pub fn new_info_at_position(meta: &impl Metadata, loc: (usize, usize)) -> Self {
Logger::new(meta.get_code(), &[ErrorDetails::with_pos(meta.get_path(), loc, 0)], LogType::Info)
}
pub fn attach_message<T: AsRef<str>>(mut self, text: T) -> Self {
self.message = Some(String::from(text.as_ref()));
self
}
pub fn attach_comment<T: AsRef<str>>(mut self, text: T) -> Self {
self.comment = Some(String::from(text.as_ref()));
self
}
pub fn attach_code(mut self, code: String) -> Self {
self.code = Some(code);
self
}
pub fn show(self) -> Self {
if !self.trace.is_empty() {
Displayer::new(self.kind.clone(), &self.trace)
.header(self.kind.clone())
.text(self.message.clone())
.path()
.padded_text(self.comment.clone())
.snippet(self.code.clone())
}
else {
Displayer::new(self.kind.clone(), &self.trace)
.header(self.kind.clone())
.text(self.message.clone())
.padded_text(self.comment.clone());
}
self
}
pub fn exit(self) {
process::exit(1);
}
}
#[cfg(test)]
mod test {
#[test]
fn test_logger() {
}
}