mod github;
mod npm;
mod slack;
mod stripe;
mod gitlab;
pub use github::{GithubClassicPatValidator, GithubFineGrainedPatValidator};
pub use npm::{NpmTokenValidator, PypiTokenValidator};
pub use slack::SlackTokenValidator;
pub use stripe::StripeTokenValidator;
pub use gitlab::GitlabTokenValidator;
use std::sync::LazyLock;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum ChecksumResult {
Valid,
Invalid,
NotApplicable,
}
pub trait ChecksumValidator: Send + Sync {
fn validator_id(&self) -> &str;
fn validate(&self, credential: &str) -> ChecksumResult;
}
static VALIDATORS: LazyLock<Vec<Box<dyn ChecksumValidator>>> = LazyLock::new(|| {
vec![
Box::new(GithubClassicPatValidator),
Box::new(GithubFineGrainedPatValidator),
Box::new(NpmTokenValidator),
Box::new(SlackTokenValidator),
Box::new(PypiTokenValidator),
Box::new(StripeTokenValidator),
Box::new(GitlabTokenValidator),
]
});
pub fn validate_checksum(credential: &str) -> ChecksumResult {
for validator in VALIDATORS.iter() {
match validator.validate(credential) {
ChecksumResult::NotApplicable => continue,
result => return result,
}
}
ChecksumResult::NotApplicable
}
#[cfg(test)]
mod tests;