use crate::{
config,
ui::utils::display_error,
wiki::search::{
Search, SearchBuilder, SearchMetadata, SearchProperties, SearchResult, SearchSortOrder,
},
};
use anyhow::{Context, Result};
use cursive::Cursive;
pub mod bar_popup;
mod display;
mod select;
fn build_search() -> SearchBuilder {
SearchBuilder::new(&config::CONFIG.api_config.base_url)
.info(SearchMetadata::new().total_hits())
.prop(SearchProperties::new().snippet().wordcount().timestamp())
.sort(SearchSortOrder::JustMatch)
}
pub fn on_search(siv: &mut Cursive, query: &str) {
let search = match search(query).with_context(|| format!("failed to search for '{}'", query)) {
Ok(search) => search,
Err(error) => {
warn!("{:?}", error);
display_error(siv, error);
return;
}
};
if let Err(error) = display::display_search_results(siv, search, query)
.with_context(|| format!("failed to display the search results for '{}'", query))
{
warn!("{:?}", error);
display_error(siv, error);
}
}
fn search(query: &str) -> Result<Search> {
info!("searching for '{}'", query);
build_search().query(query.to_string()).search()
}
fn on_result_select(siv: &mut Cursive, item: &SearchResult) {
info!(
"selecting the item '{}', page id: '{}'",
item.title(),
item.page_id()
);
let layer_len = siv.screen_mut().len();
let search_result_preview_name = format!("search_result_preview-{}", layer_len);
let search_result_info_name = format!("search_result_info-{}", layer_len);
if let Err(error) = select::generate_and_display_preview(siv, item, &search_result_preview_name)
.context("failed generating and displaying the preview")
{
warn!("{:?}", error);
}
if let Err(error) = select::generate_and_display_info(siv, item, &search_result_info_name)
.context("failed generating and displaying the info")
{
warn!("{:?}", error);
}
}
fn on_continue_submit(siv: &mut Cursive, search_query: &str, search_offset: &usize) {
let search = match continue_search(search_query, search_offset)
.with_context(|| format!("failed to fetch more search results for '{}'", search_query))
{
Ok(search) => search,
Err(error) => {
warn!("{:?}", error);
display_error(siv, error);
return;
}
};
if let Err(error) = display::display_more_search_results(siv, search, search_query)
.with_context(|| {
format!(
"failed displaying more search results for '{}'",
search_query
)
})
{
warn!("{:?}", error);
display_error(siv, error);
}
}
fn continue_search(search_query: &str, search_offset: &usize) -> Result<Search> {
info!("fetching more search results for '{}'", search_query);
build_search()
.query(search_query.to_string())
.offset(*search_offset)
.search()
}