// This file is part of Deja-Vu. // // Deja-Vu is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Deja-Vu is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Deja-Vu. If not, see . // use ratatui::{ style::{Color, Style}, text::{Line, Span}, }; use serde::{Deserialize, Serialize}; use std::iter::zip; use crate::system::disk::{Disk, Partition}; #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct DVLine { pub line_parts: Vec, pub line_colors: Vec, } impl DVLine { /// Convert to Line with colored span(s) #[must_use] pub fn as_line(&self) -> Line<'_> { let mut spans = Vec::new(); zip(self.line_parts.clone(), self.line_colors.clone()) .for_each(|(part, color)| spans.push(Span::styled(part, Style::default().fg(color)))); Line::from(spans) } #[must_use] pub fn blank() -> Self { Self { line_parts: vec![String::new()], line_colors: vec![Color::Reset], } } } #[must_use] pub fn get_disk_description_right( disk: &Disk, boot_os_indicies: &Option>, ) -> Vec { let mut description: Vec = vec![ DVLine { line_parts: vec![format!( "{:<8} {:>11} {:<4} {:<4} {}", "Disk ID", "Size", "Conn", "Type", "Model (Serial)" )], line_colors: vec![Color::Green], }, DVLine { line_parts: vec![disk.description.clone()], line_colors: vec![Color::Reset], }, DVLine::blank(), DVLine { line_parts: vec![format!( "{:<8} {:>11} {:<7} {}", "Part ID", "Size", "(FS)", "\"Label\"" )], line_colors: vec![Color::Blue], }, ]; disk.parts_description .iter() .enumerate() .for_each(|(index, line)| { let mut line_parts = vec![line.clone()]; let mut line_colors = vec![Color::Reset]; if let Some(indicies) = boot_os_indicies { let boot_index = indicies.first(); if boot_index.is_some_and(|i| i == &index) { line_parts.push(String::from(" <-- Boot Partition")); line_colors.push(Color::Cyan); } let boot_index = indicies.get(1); if boot_index.is_some_and(|i| i == &index) { line_parts.push(String::from(" <-- OS Partition")); line_colors.push(Color::Cyan); } } description.push(DVLine { line_parts, line_colors, }); }); description } #[must_use] pub fn get_part_description(part: &Partition) -> Vec { let description: Vec = vec![ DVLine { line_parts: vec![format!( "{:<8} {:>11} {:<7} {}", "Part ID", "Size", "(FS)", "\"Label\"" )], line_colors: vec![Color::Blue], }, DVLine { line_parts: vec![format!("{part}")], line_colors: vec![Color::Reset], }, ]; description }