use std::fmt::Write as _;
use super::formalize::CANONICAL_FISHERMAN_SYNOPSIS;
use super::planner::CANONICAL_SOURCE_URL;
struct CorpusPage {
url: &'static str,
title: &'static str,
keywords: &'static [&'static str],
body: &'static str,
}
const fn pages() -> [CorpusPage; 1] {
[CorpusPage {
url: CANONICAL_SOURCE_URL,
title: "Сказка о рыбаке и рыбке — Александр Пушкин (Викитека)",
keywords: &[
"рыбак",
"рыбке",
"рыбка",
"пушкин",
"сказка",
"fisherman",
"fish",
"pushkin",
],
body: CANONICAL_FISHERMAN_SYNOPSIS,
}]
}
#[must_use]
pub fn web_search(query: &str) -> String {
let lower = query.to_lowercase();
let all = pages();
let hits: Vec<&CorpusPage> = all
.iter()
.filter(|page| page.keywords.iter().any(|keyword| lower.contains(keyword)))
.collect();
if hits.is_empty() {
return format!("web_search: no results for {query:?}");
}
let mut out = String::new();
for (rank, page) in hits.iter().enumerate() {
let snippet: String = page.body.chars().take(80).collect();
let _ = writeln!(
out,
"{}. {}\n {}\n {}…",
rank + 1,
page.title,
page.url,
snippet.trim()
);
}
out.trim_end().to_owned()
}
#[must_use]
pub fn web_fetch(url: &str) -> String {
pages().iter().find(|page| page.url == url).map_or_else(
|| format!("web_fetch error: 404 not found for {url}"),
|page| page.body.to_owned(),
)
}