mltop 0.1.0

Resource monitor for ML engineers written in Rust
use crate::constants::BYTES_PER_GB;
use crate::data::components::memory::Memory;
use crate::widgets::percentage_bar::percentage_bar;

use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::{Color, Style},
    text::{Line, Span, Text},
    widgets::{Paragraph, Widget},
};

pub struct MemoryWidget {
    data: Memory,
}

impl MemoryWidget {
    pub fn new(data: Memory) -> MemoryWidget {
        MemoryWidget { data }
    }
}

impl Widget for MemoryWidget {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let mut spans = vec![Span::styled("Memory", Style::default().fg(Color::Cyan))];
        let percentage = self.data.used as f32 / self.data.total as f32 * 100.0;
        let text = format!(
            "{:.1}G/{:.1}G",
            self.data.used as f32 / BYTES_PER_GB as f32,
            self.data.total as f32 / BYTES_PER_GB as f32
        );
        spans.extend(percentage_bar(area.width - 11, percentage, &text));

        let mut lines = vec![Line::from(spans)];

        let mut spans = vec![Span::styled("  Swap", Style::default().fg(Color::Cyan))];
        let percentage = self.data.used_swap as f32 / self.data.total_swap as f32 * 100.0;
        let text = format!(
            "{:.1}G/{:.1}G",
            self.data.used_swap as f32 / BYTES_PER_GB as f32,
            self.data.total_swap as f32 / BYTES_PER_GB as f32
        );
        spans.extend(percentage_bar(area.width - 11, percentage, &text));

        lines.push(Line::from(spans));

        let content = Text::from(lines);
        Paragraph::new(content).centered().render(area, buf);
    }
}