#[cfg(feature = "std")]
fn main() -> Result<clientele::SysexitsError, Box<dyn std::error::Error>> {
use asimov_module::getenv;
use asimov_serpapi_module::{api::SerpApi, find_engine_for, jq};
use clientele::SysexitsError::*;
use std::io::stdout;
clientele::dotenv().ok();
let args = clientele::args_os()?;
#[cfg(feature = "tracing")]
tracing_subscriber::fmt()
.with_writer(std::io::stderr)
.with_max_level(tracing_subscriber::filter::LevelFilter::WARN)
.init();
let urls: Vec<String> = args
.iter()
.skip(1)
.map(|arg| arg.to_string_lossy().into())
.collect();
if urls.is_empty() {
return Ok(EX_OK);
}
let Some(api_key) = getenv::var_secret("SERPAPI_KEY") else {
return Ok(EX_CONFIG); };
let api = SerpApi::new(api_key);
for url in urls {
let Some(engine) = find_engine_for(&url) else {
return Ok(EX_UNAVAILABLE); };
let response = match engine.id {
"bing" => api.search_bing(&url.parse().map_err(|_| EX_DATAERR)?)?,
"duckduckgo" => api.search_duckduckgo(&url.parse().map_err(|_| EX_DATAERR)?)?,
"google" => api.search_google(&url.parse().map_err(|_| EX_DATAERR)?)?,
_ => {
return Ok(EX_UNAVAILABLE); }
};
let response = jq::search().filter_json_str(response)?;
if cfg!(feature = "pretty") {
colored_json::write_colored_json(&response, &mut stdout())?;
println!();
} else {
println!("{}", serde_json::to_string(&response).unwrap());
}
}
Ok(EX_OK)
}
#[cfg(not(feature = "std"))]
fn main() {
unimplemented!("asimov-serpapi-importer requires the 'std' feature")
}