use colored::Colorize;
use derive_more::{Display, From};
use serde::Serialize;
use crate::error::{ModuleErrorKind, SubscanError};
#[derive(Clone, Debug, Default, Display, Eq, From, Ord, PartialEq, PartialOrd)]
pub enum SubscanModuleStatus {
#[default]
#[display("STARTED")]
Started,
#[display("FINISHED")]
Finished,
#[from]
#[display("SKIPPED")]
Skipped(SkipReason),
#[from(ModuleErrorKind, &str)]
#[display("FAILED")]
Failed(ModuleErrorKind),
}
impl From<SubscanError> for SubscanModuleStatus {
fn from(err: SubscanError) -> Self {
err.status()
}
}
impl Serialize for SubscanModuleStatus {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
impl SubscanModuleStatus {
pub fn with_reason(&self) -> String {
match self {
SubscanModuleStatus::Started => format!("[{self}]"),
SubscanModuleStatus::Finished => format!("[{self}]"),
SubscanModuleStatus::Failed(err) => format!("[{err} {self}]"),
SubscanModuleStatus::Skipped(reason) => format!("[{reason} {self}]"),
}
}
pub fn log(&self, module: &str) {
match self {
SubscanModuleStatus::Started | SubscanModuleStatus::Finished => {
log::debug!("{:.<25}{:.>35}", module.white(), self.with_reason().white())
}
SubscanModuleStatus::Skipped(_) => {
log::warn!(
"{:.<25}{:.>35}",
module.yellow(),
self.with_reason().yellow()
)
}
SubscanModuleStatus::Failed(err) => {
log::error!("{:.<25}{:.>35}", module.red(), err.with_msg().red())
}
}
}
}
#[derive(Clone, Debug, Display, Eq, Ord, PartialEq, PartialOrd, Serialize)]
pub enum SkipReason {
#[display("auth not provided")]
AuthenticationNotProvided,
#[display("skipped by user")]
SkippedByUser,
}