use anyhow::Result;
use serde::{Deserialize, Serialize};
use tabled::Tabled;
use crate::version;
#[derive(Clone, Debug, Serialize, Deserialize, Tabled)]
#[tabled(rename_all = "UpperCase")]
pub struct Finding {
#[tabled(rename = "CHECK")]
pub code: Code,
#[tabled(rename = " ")]
pub symbol: String,
#[tabled(skip)]
pub remediation: Remediation,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum Remediation {
Required,
Recommended,
}
impl Remediation {
pub(crate) fn symbol(&self) -> String {
match &self {
Remediation::Required => "❌".to_string(),
Remediation::Recommended => "⚠️".to_string(),
}
}
}
impl std::fmt::Display for Remediation {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match *self {
Remediation::Required => write!(f, "Required"),
Remediation::Recommended => write!(f, "Recommended"),
}
}
}
pub trait Findings {
fn to_markdown_table(&self, leading_whitespace: &str) -> Result<String>;
fn to_stdout_table(&self) -> Result<String>;
}
pub(crate) trait Deprecation {
fn deprecated_in(&self) -> Option<version::KubernetesVersion>;
fn removed_in(&self) -> Option<version::KubernetesVersion>;
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum Code {
AWS001,
AWS002,
AWS003,
AWS004,
AWS005,
EKS001,
EKS002,
EKS003,
EKS004,
EKS005,
EKS006,
EKS007,
K8S001,
K8S002,
K8S003,
K8S004,
K8S005,
K8S006,
K8S007,
}
impl std::fmt::Display for Code {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match *self {
Code::AWS001 => write!(f, "AWS001"),
Code::AWS002 => write!(f, "AWS002"),
Code::AWS003 => write!(f, "AWS003"),
Code::AWS004 => write!(f, "AWS004"),
Code::AWS005 => write!(f, "AWS005"),
Code::EKS001 => write!(f, "EKS001"),
Code::EKS002 => write!(f, "EKS002"),
Code::EKS003 => write!(f, "EKS003"),
Code::EKS004 => write!(f, "EKS004"),
Code::EKS005 => write!(f, "EKS005"),
Code::EKS006 => write!(f, "EKS006"),
Code::EKS007 => write!(f, "EKS007"),
Code::K8S001 => write!(f, "K8S001"),
Code::K8S002 => write!(f, "K8S002"),
Code::K8S003 => write!(f, "K8S003"),
Code::K8S004 => write!(f, "K8S004"),
Code::K8S005 => write!(f, "K8S005"),
Code::K8S006 => write!(f, "K8S006"),
Code::K8S007 => write!(f, "K8S007"),
}
}
}