use cosh_tools::web::{Web, WebFetch, WebSearch};
#[tokio::main]
async fn main() {
let web = Web::new();
println!("== 1. tool schemas ==");
println!(
" web_fetch requires: {:?}",
web.description_fetch["inputSchema"]["required"]
);
println!(
" web_search requires: {:?}\n",
web.description_search["inputSchema"]["required"]
);
println!("== 2. validation ==");
let err = cosh_tools::web::search(&WebSearch {
num_results: 5,
query: String::new(),
})
.await
.unwrap_err();
println!(" empty query -> {err}");
let err = cosh_tools::web::search(&WebSearch {
num_results: 0,
query: "x".into(),
})
.await
.unwrap_err();
println!(" num_results 0 -> {err}\n");
println!("== 3. web.fetch example.com (best effort) ==");
match web
.fetch(WebFetch {
url: "https://example.com".into(),
})
.await
{
Ok(text) => {
println!(" fetched {} bytes, first 200:", text.len());
for line in text.lines().take(6) {
println!(" {line}");
}
}
Err(e) => println!(" fetch failed: {e}"),
}
println!();
let searcher = Web::new().num_results(3);
println!("== 4. web.search (best effort, num_results=3) ==");
match searcher.search("rust programming language").await {
Ok(results) => {
println!(
" result blocks: {}",
results.matches("\n---\n").count() + 1
);
for line in results.lines().take(9) {
println!(" {line}");
}
}
Err(e) => println!(" search failed: {e}"),
}
println!();
}