mod search;
mod transcripts;
use anyhow::Result;
use camino::Utf8PathBuf;
use self::{search::SessionSearch, transcripts::TranscriptCache};
use crate::index::{Indexer, Session, Transcript};
pub(crate) struct App {
transcripts: TranscriptCache,
pub(crate) sessions: Vec<Session>,
pub(crate) search: SessionSearch,
pub(crate) matches: Vec<usize>,
pub(crate) indexer: Indexer,
pub(crate) cwd: Utf8PathBuf,
pub(crate) cwd_only: bool,
}
impl App {
pub(crate) fn new(sessions: Vec<Session>, indexer: Indexer, cwd: Utf8PathBuf) -> Self {
let mut app = Self {
transcripts: TranscriptCache::default(),
sessions: vec![],
search: SessionSearch::new(),
matches: vec![],
indexer,
cwd,
cwd_only: false,
};
app.set_sessions(sessions);
return app;
}
fn set_sessions(&mut self, sessions: Vec<Session>) {
self.sessions = sessions;
self.search.set_sessions(&self.sessions);
self.update_matches();
}
fn update_matches(&mut self) {
let answers = if self.search.is_empty() { (0 .. self.sessions.len()).collect() } else { self.search.ranked() };
self.matches = answers
.into_iter()
.filter(|&i| !self.cwd_only || self.sessions[i].cwd.starts_with(&self.cwd))
.collect();
}
pub(crate) fn toggle_cwd_only(&mut self) {
self.cwd_only = !self.cwd_only;
self.update_matches();
}
pub(crate) fn refresh(&mut self) -> bool {
let Some(sessions) = self.indexer.poll()
else {
self.update_matches();
return false;
};
self.set_sessions(sessions);
return true;
}
pub(crate) fn set_query(&mut self, query: &str) {
self.search.set_query(&self.sessions, query);
self.update_matches();
}
pub(crate) fn load_transcript(&mut self, index: usize) {
self.transcripts.load(&self.sessions[index]);
}
pub(crate) fn transcript(&self, index: usize) -> Option<&Result<Transcript>> {
return self.transcripts.get(&self.sessions[index]);
}
pub(crate) fn is_busy(&self) -> bool {
return self.indexer.progress.is_some() || self.transcripts.is_reading();
}
}