use crate::document::{ChildRoute, NodeId, TopicEntry};
pub use super::config::{DocContext, WorkspaceContext};
#[derive(Debug, Clone)]
pub struct FindHit {
pub keyword: String,
pub entries: Vec<TopicEntry>,
}
impl<'a> DocContext<'a> {
pub fn ls(&self, node: NodeId) -> Option<&[ChildRoute]> {
self.nav_index.get_child_routes(node)
}
pub fn cat(&self, node: NodeId) -> Option<&str> {
self.tree.get(node).map(|n| n.content.as_str())
}
pub fn node_title(&self, node: NodeId) -> Option<&str> {
self.tree.get(node).map(|n| n.title.as_str())
}
pub fn find(&self, keyword: &str) -> Option<FindHit> {
self.reasoning_index
.topic_entries(keyword)
.map(|entries| FindHit {
keyword: keyword.to_string(),
entries: entries.to_vec(),
})
}
pub fn find_all(&self, keywords: &[String]) -> Vec<FindHit> {
keywords.iter().filter_map(|kw| self.find(kw)).collect()
}
pub fn root(&self) -> NodeId {
self.tree.root()
}
pub fn doc_card(&self) -> Option<&crate::document::DocCard> {
self.nav_index.doc_card()
}
pub fn nav_entry(&self, node: NodeId) -> Option<&crate::document::NavEntry> {
self.nav_index.get_entry(node)
}
pub fn summary_shortcut(&self) -> Option<&crate::document::SummaryShortcut> {
self.reasoning_index.summary_shortcut()
}
pub fn find_section(&self, title: &str) -> Option<NodeId> {
self.reasoning_index.find_section(title)
}
pub fn parent(&self, node: NodeId) -> Option<NodeId> {
self.tree.parent(node)
}
}
impl<'a> WorkspaceContext<'a> {
pub fn find_cross(&self, keyword: &str) -> Vec<(usize, FindHit)> {
self.docs
.iter()
.enumerate()
.filter_map(|(idx, doc)| doc.find(keyword).map(|hit| (idx, hit)))
.collect()
}
pub fn find_cross_all(&self, keywords: &[String]) -> Vec<(usize, Vec<FindHit>)> {
let mut results: Vec<(usize, Vec<FindHit>)> = Vec::new();
for (idx, doc) in self.docs.iter().enumerate() {
let hits = doc.find_all(keywords);
if !hits.is_empty() {
results.push((idx, hits));
}
}
results
}
pub fn doc_cards(&self) -> Vec<(usize, &crate::document::DocCard)> {
self.docs
.iter()
.enumerate()
.filter_map(|(idx, doc)| doc.doc_card().map(|card| (idx, card)))
.collect()
}
pub fn doc(&self, idx: usize) -> Option<&DocContext<'a>> {
self.docs.get(idx)
}
}