use crate::core::{protocol::DoHProtocol, provider::DoHProvider, resolver::DoHResolver};
use crate::doh_json::{resolver::DoHJsonResolver, provider::DoHJsonProvider};
use log::LevelFilter;
use std::net::{Ipv4Addr, Ipv6Addr};
pub trait Config {
fn ipv4(&self) -> Vec<Ipv4Addr>;
fn ipv6(&self) -> Vec<Ipv6Addr>;
fn port(&self) -> u16;
fn log_filter(&self) -> LevelFilter;
fn protocol(&self) -> DoHProtocol;
fn provider(&self) -> Option<Box<dyn DoHProvider>>;
fn resolver(&self) -> Box<DoHResolver + Send> {
match self.protocol() {
DoHProtocol::JSON => match self.provider() {
Some(provider) => Box::new(DoHJsonResolver::new(*provider.downcast::<DoHJsonProvider>().unwrap())),
None => panic!("Unable to determine DoH JSON Provider: this should never be reached!"),
},
DoHProtocol::WIRE => panic!("Unable to determine DoH WIRE Provider: this should never be reached!"),
}
}
}