malwaredb 0.3.5

Service for storing malicious, benign, or unknown files and related metadata and relationships.
// SPDX-License-Identifier: Apache-2.0

use malwaredb_api::Labels;
use malwaredb_server::State;

use std::sync::Arc;

use anyhow::Result;
use eframe::egui::Id;

const COLUMN_HEADERS: [&str; 3] = ["ID", "Name", "Parent"];

/// Labels table
#[derive(Debug, Clone)]
pub struct LabelTable {
    #[allow(dead_code)]
    state: Arc<State>,

    labels: Labels,
}

impl LabelTable {
    pub async fn new(state: Arc<State>) -> Result<Self> {
        let labels = state.db_type.get_labels().await?;
        Ok(Self { state, labels })
    }

    pub fn ui(&mut self, ui: &mut eframe::egui::Ui) {
        let id_salt = Id::new("label_table");

        let table = egui_table::Table::new()
            .id_salt(id_salt)
            .auto_size_mode(egui_table::AutoSizeMode::OnParentResize)
            .num_rows(self.labels.len() as u64)
            .columns(
                (0..COLUMN_HEADERS.len())
                    .map(|_| egui_table::Column::new(100.0).resizable(true))
                    .collect::<Vec<_>>(),
            );

        table.show(ui, self);
    }
}

impl egui_table::TableDelegate for LabelTable {
    fn header_cell_ui(&mut self, ui: &mut eframe::egui::Ui, cell: &egui_table::HeaderCellInfo) {
        if let Some(header) = COLUMN_HEADERS.get(cell.group_index) {
            ui.label(*header);
        }
    }

    fn cell_ui(&mut self, ui: &mut eframe::egui::Ui, cell: &egui_table::CellInfo) {
        let Some(label) = usize::try_from(cell.row_nr)
            .ok()
            .and_then(|row| self.labels.0.get(row))
        else {
            return;
        };

        let text: std::borrow::Cow<str> = match cell.col_nr {
            0 => label.id.to_string().into(),
            1 => label.name.as_str().into(),
            2 => label.parent.as_deref().unwrap_or_default().into(),
            _ => "".into(),
        };
        ui.label(text.as_ref());
    }
}