Skip to main content

plot/lib/job/
step2.rs

1use crate::lib::{
2	job::{self, ValidResultMainRow},
3	logic,
4};
5// ============================================================================
6// STRUKTURA WYJŚCIOWA (Transport do kolejnych etapów)
7// ============================================================================
8
9#[derive(Debug, Clone)]
10pub struct FormattedRow {
11	pub raw: ValidResultMainRow, // Zachowujemy oryginał do sortowania (Step 3) i limitowania (Step 4)
12	pub cells: Vec<String>,      // Sformatowane kolumny, każda jako niezależny String (dla Step 5)
13}
14
15// ============================================================================
16// FORMATTER (Step 2)
17// ============================================================================
18
19pub fn engine_step2_data_formater(
20	c: (&job::ValidColumnItemConfig, &job::ValidTableColumnsConfig),
21	s: (&job::ValidColumnDateConfig, &job::ValidColumnTimeConfig, &job::ValidColumnSizeConfig),
22	tab: &job::ValidResultMainTab, // ⚡ Zmiana typu
23) -> Vec<FormattedRow> {
24	let item_cfg = c.0;
25	let col_cfg = c.1;
26	let date_cfg = s.0;
27	let time_cfg = s.1;
28	let size_cfg = s.2;
29
30	let total_rows = tab.rows.len();
31	let num_width = total_rows.to_string().len();
32
33	let mut formatted_table = Vec::with_capacity(total_rows);
34
35	for (i, row) in tab.rows.iter().enumerate() {
36		// ⚡ Iterujemy po tab.rows
37		let mut cells = Vec::with_capacity(col_cfg.columns.len());
38
39		for col in &col_cfg.columns {
40			let cell_str = match col {
41				job::ValidTableColumnsParse::Date => date_cfg.format_date(row.dt_modified),
42				job::ValidTableColumnsParse::Time => time_cfg.format_time(row.dt_modified),
43				job::ValidTableColumnsParse::Size => size_cfg.format_size(row.size_real),
44				job::ValidTableColumnsParse::Item => {
45					let u_params = (i, num_width, tab.tier_max, tab.name_len_max);
46					item_cfg.format_item(u_params, row, &tab.rows)
47				}
48				job::ValidTableColumnsParse::Path => {
49					let mut p_str = row.node.path.str.clone();
50
51					// ⚡ PROPAGACJA: Jeśli Item ma włączone wyrównanie (ws-show), wyrównujemy też ścieżkę
52					if item_cfg.align_end {
53						let padding = tab.path_len_max.saturating_sub(p_str.chars().count());
54						p_str.push_str(&" ".repeat(padding));
55					}
56					p_str
57				}
58			};
59			cells.push(cell_str);
60		}
61
62		if job::IS_DEBUG {
63			let type_node = match row.node.node {
64				logic::NodeIs::Dir => "📂",
65				logic::NodeIs::File => "📃",
66			};
67			// id_self (formatujemy jako [ 🆔 XXX ]) &&  id_path (formatujemy jako wektor ID [0, 1, ...])
68			cells.push(format!("🆔{}[{:?}] 🔙📂{:?}", type_node, row.node.id_self, row.node.id_path));
69		}
70
71		formatted_table.push(FormattedRow { raw: row.clone(), cells });
72	}
73
74	formatted_table
75}
76
77// ============================================================================
78// HELPERY FORMATUJĄCE
79// ============================================================================