use enum_dispatch::enum_dispatch;
use prettytable::{row, Row};
use crate::{
extractors::{html::HTMLExtractor, json::JSONExtractor, regex::RegexExtractor},
interfaces::module::SubscanModuleInterface,
modules::{
generics::{engine::GenericSearchEngineModule, integration::GenericIntegrationModule},
integrations::{
commoncrawl::CommonCrawl, dnsdumpstercrawler::DNSDumpsterCrawler, github::GitHub,
netlas::Netlas, waybackarchive::WaybackArchive,
},
zonetransfer::ZoneTransfer,
},
requesters::{chrome::ChromeBrowser, client::HTTPClient},
};
#[enum_dispatch(SubscanModuleInterface)]
pub enum SubscanModuleDispatcher {
GenericIntegrationModule(GenericIntegrationModule),
GenericSearchEngineModule(GenericSearchEngineModule),
CommonCrawl(CommonCrawl),
DNSDumpsterCrawler(DNSDumpsterCrawler),
GitHub(GitHub),
Netlas(Netlas),
WaybackArchive(WaybackArchive),
ZoneTransfer(ZoneTransfer),
}
impl SubscanModuleDispatcher {
pub async fn is_generic(&self) -> bool {
matches!(
self,
SubscanModuleDispatcher::GenericIntegrationModule(_)
| SubscanModuleDispatcher::GenericSearchEngineModule(_)
)
}
pub async fn as_table_row(&self) -> Row {
let requester = if let Some(instance) = self.requester().await {
instance.lock().await.to_string()
} else {
"None".into()
};
let extractor = if let Some(instance) = self.extractor().await {
instance.to_string()
} else {
"None".into()
};
row![
self.name().await,
requester,
extractor,
self.is_generic().await
]
}
}
#[enum_dispatch(SubdomainExtractorInterface)]
pub enum SubdomainExtractorDispatcher {
HTMLExtractor(HTMLExtractor),
RegexExtractor(RegexExtractor),
JSONExtractor(JSONExtractor),
}
#[allow(clippy::to_string_trait_impl)]
impl ToString for SubdomainExtractorDispatcher {
fn to_string(&self) -> String {
match self {
SubdomainExtractorDispatcher::HTMLExtractor(_) => "HTMLExtractor".into(),
SubdomainExtractorDispatcher::RegexExtractor(_) => "RegexExtractor".into(),
SubdomainExtractorDispatcher::JSONExtractor(_) => "JSONExtractor".into(),
}
}
}
#[enum_dispatch(RequesterInterface)]
pub enum RequesterDispatcher {
ChromeBrowser(ChromeBrowser),
HTTPClient(HTTPClient),
}
#[allow(clippy::to_string_trait_impl)]
impl ToString for RequesterDispatcher {
fn to_string(&self) -> String {
match self {
RequesterDispatcher::ChromeBrowser(_) => "ChromeBrowser".into(),
RequesterDispatcher::HTTPClient(_) => "HTTPClient".into(),
}
}
}