subscan 1.3.0

A subdomain enumeration tool leveraging diverse techniques, designed for advanced pentesting operations
Documentation
use std::{
    net::{IpAddr, Ipv4Addr},
    str::FromStr,
};

use async_trait::async_trait;
use subscan::{
    interfaces::lookup::LookUpHostFuture,
    types::{config::resolver::ResolverConfig, func::AsyncIPResolveFunc},
};

use crate::common::constants::LOCAL_HOST;

#[derive(Default)]
pub struct MockResolver {
    config: ResolverConfig,
}

impl MockResolver {
    pub fn new(config: ResolverConfig) -> Self {
        Self { config }
    }

    pub fn boxed(config: ResolverConfig) -> Box<Self> {
        Box::new(Self::new(config))
    }

    pub fn default_boxed() -> Box<Self> {
        Box::new(Self::default())
    }
}

impl From<ResolverConfig> for MockResolver {
    fn from(config: ResolverConfig) -> Self {
        Self { config }
    }
}

#[async_trait]
impl LookUpHostFuture for MockResolver {
    async fn lookup_host_future(&self) -> AsyncIPResolveFunc {
        if self.config.disabled {
            Box::new(|_: String| Box::pin(async move { None }))
        } else {
            Box::new(move |_: String| {
                Box::pin(async move { Some(IpAddr::V4(Ipv4Addr::from_str(LOCAL_HOST).unwrap())) })
            })
        }
    }

    async fn config(&self) -> ResolverConfig {
        self.config.clone()
    }
}