pub mod investigations;
pub mod jobs;
pub mod packs;
pub mod query;
pub mod session;
pub mod settings;
pub mod workspaces;
use crate::client::Client;
use crate::query_job::QueryJobResult;
use crate::tui::message::Tab;
use investigations::InvestigationsModel;
use jobs::JobsModel;
use packs::PacksModel;
use query::QueryModel;
use session::SessionModel;
use settings::SettingsModel;
use tokio::sync::mpsc;
use workspaces::WorkspacesModel;
pub struct Model {
pub current_tab: Tab,
pub settings: SettingsModel,
pub workspaces: WorkspacesModel,
pub query: QueryModel,
pub jobs: JobsModel,
pub sessions: SessionModel,
pub packs: PacksModel,
pub investigations: InvestigationsModel,
pub client: Client,
pub popup: Option<Popup>,
pub job_update_rx: mpsc::UnboundedReceiver<JobUpdateMessage>,
pub job_update_tx: mpsc::UnboundedSender<JobUpdateMessage>,
pub init_state: InitState,
pub spinner_frame: usize,
}
#[derive(Debug, Clone)]
pub enum Popup {
Error(String),
Success(String),
SettingsEdit,
JobNameInput,
JobDetails(usize),
SessionNameInput,
}
#[derive(Debug, Clone)]
pub enum JobUpdateMessage {
Completed(u64, QueryJobResult), }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InitState {
Initializing,
Ready,
Failed,
}
impl Model {
pub fn new(client: Client) -> Self {
let (job_update_tx, job_update_rx) = mpsc::unbounded_channel();
Self {
current_tab: Tab::Query,
settings: SettingsModel::new(),
workspaces: WorkspacesModel::new(),
query: QueryModel::new(),
jobs: JobsModel::new(),
sessions: SessionModel::new(),
packs: PacksModel::new(),
investigations: InvestigationsModel::new(),
client,
popup: None,
job_update_rx,
job_update_tx,
init_state: InitState::Initializing,
spinner_frame: 0,
}
}
pub fn rebuild_client(&mut self) -> Result<(), crate::error::KqlPanopticonError> {
use std::time::Duration;
self.client = Client::with_config(
Duration::from_secs(self.settings.validation_interval_secs),
Duration::from_secs(self.settings.query_timeout_secs),
self.settings.retry_count,
)?;
Ok(())
}
pub fn process_job_updates(&mut self) {
let mut should_sort = false;
while let Ok(message) = self.job_update_rx.try_recv() {
match message {
JobUpdateMessage::Completed(job_idx, result) => {
self.jobs.complete_job(job_idx, result);
should_sort = true;
}
}
}
if should_sort {
self.jobs.sort_by_timestamp();
}
}
}