use xuanji::{RuleKey, Severity};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SignatureBoundary {
pub(crate) crate_package: String,
pub(crate) module: String,
pub(crate) forbidden: Vec<String>,
pub(crate) reason: String,
pub(crate) anchor: Option<String>,
pub(crate) severity: Severity,
pub(crate) including_trait_impls: bool,
}
impl SignatureBoundary {
pub fn rule_key(&self) -> RuleKey {
RuleKey::of(
"tianheng.rule/hunyi/signature-exposure",
[
("forbidden", super::canonical_path_set(&self.forbidden)),
(
"including_trait_impls",
self.including_trait_impls.to_string(),
),
],
)
}
pub fn in_crate(package: &str) -> SignatureCrateDraft {
SignatureCrateDraft {
crate_package: package.to_string(),
}
}
pub fn module(&self) -> &str {
&self.module
}
pub fn forbidden(&self) -> &[String] {
&self.forbidden
}
pub fn reason(&self) -> &str {
&self.reason
}
pub fn including_trait_impls(&self) -> bool {
self.including_trait_impls
}
}
crate::dsl::boundary_common!(SignatureBoundary, SignatureBoundaryDraft);
#[doc(hidden)]
pub struct SignatureCrateDraft {
crate_package: String,
}
impl SignatureCrateDraft {
pub fn module(self, module: &str) -> SignatureModuleDraft {
SignatureModuleDraft {
crate_package: self.crate_package,
module: module.to_string(),
}
}
}
#[doc(hidden)]
pub struct SignatureModuleDraft {
crate_package: String,
module: String,
}
impl SignatureModuleDraft {
pub fn must_not_expose(self, path: &str) -> SignatureBoundaryDraft {
SignatureBoundaryDraft {
crate_package: self.crate_package,
module: self.module,
forbidden: vec![path.to_string()],
severity: Severity::Enforce,
including_trait_impls: false,
}
}
}
#[doc(hidden)]
pub struct SignatureBoundaryDraft {
crate_package: String,
module: String,
forbidden: Vec<String>,
severity: Severity,
including_trait_impls: bool,
}
impl SignatureBoundaryDraft {
pub fn and_not_expose(mut self, path: &str) -> Self {
self.forbidden.push(path.to_string());
self
}
pub fn including_trait_impls(mut self) -> Self {
self.including_trait_impls = true;
self
}
pub fn because(self, reason: &str) -> SignatureBoundary {
SignatureBoundary {
crate_package: self.crate_package,
module: self.module,
forbidden: self.forbidden,
reason: reason.to_string(),
anchor: None,
severity: self.severity,
including_trait_impls: self.including_trait_impls,
}
}
}