use clap::Parser;
use duckduckgo::browser::{Browser, ResultFormat};
use duckduckgo::cli::Cli;
use duckduckgo::colors::{AnsiColor, AnsiStyle};
use duckduckgo::user_agents::USER_AGENTS;
use urlencoding::encode;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Cli::parse();
let style = AnsiStyle {
bold: true,
color: Some(AnsiColor::Red),
};
let mut client_builder = reqwest::Client::builder();
if !args.user_agent.is_empty() {
if let Some(user_agent) = USER_AGENTS.get(&args.user_agent[..]) {
client_builder = client_builder.user_agent(*user_agent);
} else {
eprintln!(
"{}Error: Invalid user agent selected!{}",
style.escape_code(),
AnsiStyle::reset_code()
);
std::process::exit(1);
}
}
if args.cookie {
client_builder = client_builder.cookie_store(true);
}
if !args.proxy.is_empty() {
let proxy = reqwest::Proxy::all(&args.proxy)?;
client_builder = client_builder.proxy(proxy);
}
let client = client_builder.build()?;
let browser = Browser::new(client);
let result_format = if args.format {
ResultFormat::Detailed
} else {
ResultFormat::List
};
let limit = args.limit;
if !args.query.is_empty() {
if !args.operators.is_empty() {
browser
.search_operators(
&encode(&args.query),
&encode(&args.operators),
args.safe,
result_format,
Some(limit),
)
.await?;
} else {
browser
.search(&encode(&args.query), args.safe, result_format, Some(limit))
.await?;
}
} else {
eprintln!(
"{}Error: Query is required!{}",
style.escape_code(),
AnsiStyle::reset_code()
);
std::process::exit(1);
}
Ok(())
}