use async_trait::async_trait;
use enum_dispatch::enum_dispatch;
use flume::Sender;
use tokio::sync::Mutex;
use super::requester::RequesterInterface;
use crate::{
enums::{
dispatchers::{RequesterDispatcher, SubdomainExtractorDispatcher, SubscanModuleDispatcher},
result::OptionalSubscanModuleResult,
},
modules::{
generics::{engine::GenericSearchEngineModule, integration::GenericIntegrationModule},
integrations::{
commoncrawl::CommonCrawl, dnsdumpstercrawler::DNSDumpsterCrawler, github::GitHub,
netlas::Netlas, waybackarchive::WaybackArchive,
},
zonetransfer::ZoneTransfer,
},
types::{
config::requester::RequesterConfig, core::Subdomain, env::SubscanModuleEnvs,
result::status::SubscanModuleStatus,
},
};
#[async_trait]
#[enum_dispatch]
pub trait SubscanModuleInterface: Sync + Send {
async fn name(&self) -> &str;
async fn envs(&self) -> SubscanModuleEnvs {
self.name().await.into()
}
async fn requester(&self) -> Option<&Mutex<RequesterDispatcher>>;
async fn extractor(&self) -> Option<&SubdomainExtractorDispatcher>;
async fn configure(&self, rconfig: RequesterConfig) {
if let Some(requester) = self.requester().await {
requester.lock().await.configure(rconfig).await;
}
}
async fn run(&mut self, domain: &str, results: Sender<OptionalSubscanModuleResult>);
async fn item(&self, sub: &Subdomain) -> OptionalSubscanModuleResult {
(self.name().await, sub).into()
}
async fn status(&self, status: SubscanModuleStatus) -> OptionalSubscanModuleResult {
(self.name().await, status).into()
}
async fn error(&self, msg: &str) -> OptionalSubscanModuleResult {
(self.name().await, msg).into()
}
}