blob: dc3be2a26a2b475716bc07e55042c954c8c4ff1b [file] [log] [blame]
use crate::{
diag::{CfgCoord, Diag, Diagnostic, Label, Severity},
LintLevel,
};
#[derive(
strum::Display,
strum::EnumString,
strum::EnumIter,
strum::IntoStaticStr,
Copy,
Clone,
Debug,
PartialEq,
Eq,
)]
#[strum(serialize_all = "kebab-case")]
pub enum Code {
GitSourceUnderspecified,
AllowedSource,
AllowedByOrganization,
SourceNotAllowed,
UnmatchedSource,
UnmatchedOrganization,
}
impl From<Code> for String {
fn from(c: Code) -> Self {
c.to_string()
}
}
pub(crate) struct BelowMinimumRequiredSpec<'a> {
pub(crate) src_label: &'a Label,
pub(crate) min_spec: super::cfg::GitSpec,
pub(crate) actual_spec: super::cfg::GitSpec,
pub(crate) min_spec_cfg: CfgCoord,
}
impl<'a> From<BelowMinimumRequiredSpec<'a>> for Diag {
fn from(bmrs: BelowMinimumRequiredSpec<'a>) -> Self {
Diagnostic::new(Severity::Error)
.with_message(format!(
"'git' source is underspecified, expected '{}', but found '{}'",
bmrs.min_spec, bmrs.actual_spec,
))
.with_code(Code::GitSourceUnderspecified)
.with_labels(vec![
bmrs.src_label.clone(),
bmrs.min_spec_cfg
.into_label()
.with_message("minimum spec defined here"),
])
.into()
}
}
pub(crate) struct ExplicitlyAllowedSource<'a> {
pub(crate) src_label: &'a Label,
pub(crate) type_name: &'a str,
pub(crate) allow_cfg: CfgCoord,
}
impl<'a> From<ExplicitlyAllowedSource<'a>> for Diag {
fn from(eas: ExplicitlyAllowedSource<'a>) -> Self {
Diagnostic::new(Severity::Note)
.with_message(format!("'{}' source explicitly allowed", eas.type_name))
.with_code(Code::AllowedSource)
.with_labels(vec![
eas.src_label.clone(),
eas.allow_cfg.into_label().with_message("source allowance"),
])
.into()
}
}
pub(crate) struct SourceAllowedByOrg<'a> {
pub(crate) src_label: &'a Label,
pub(crate) org_cfg: CfgCoord,
}
impl<'a> From<SourceAllowedByOrg<'a>> for Diag {
fn from(sabo: SourceAllowedByOrg<'a>) -> Self {
Diagnostic::new(Severity::Note)
.with_message("source allowed by organization allowance")
.with_code(Code::AllowedByOrganization)
.with_labels(vec![
sabo.src_label.clone(),
sabo.org_cfg
.into_label()
.with_message("organization allowance"),
])
.into()
}
}
pub(crate) struct SourceNotExplicitlyAllowed<'a> {
pub(crate) src_label: &'a Label,
pub(crate) type_name: &'a str,
pub(crate) lint_level: LintLevel,
}
impl<'a> From<SourceNotExplicitlyAllowed<'a>> for Diag {
fn from(snea: SourceNotExplicitlyAllowed<'a>) -> Self {
Diagnostic::new(snea.lint_level.into())
.with_message(format!(
"detected '{}' source not explicitly allowed",
snea.type_name,
))
.with_code(Code::SourceNotAllowed)
.with_labels(vec![snea.src_label.clone()])
.into()
}
}
pub(crate) struct UnmatchedAllowSource {
pub(crate) allow_src_cfg: CfgCoord,
}
impl From<UnmatchedAllowSource> for Diag {
fn from(uas: UnmatchedAllowSource) -> Self {
Diagnostic::new(Severity::Warning)
.with_message("allowed source was not encountered")
.with_code(Code::UnmatchedSource)
.with_labels(vec![uas
.allow_src_cfg
.into_label()
.with_message("no crate source matched these criteria")])
.into()
}
}
pub(crate) struct UnmatchedAllowOrg {
pub(crate) allow_org_cfg: CfgCoord,
pub(crate) org_type: super::OrgType,
}
impl From<UnmatchedAllowOrg> for Diag {
fn from(uao: UnmatchedAllowOrg) -> Self {
Diagnostic::new(Severity::Warning)
.with_message(format!(
"allowed '{}' organization was not encountered",
uao.org_type
))
.with_code(Code::UnmatchedOrganization)
.with_labels(vec![uao
.allow_org_cfg
.into_label()
.with_message("no crate source fell under this organization")])
.into()
}
}