Skip to main content

plot/lib/display/
job_spec.rs

1use super::Color;
2use crate::lib::logic::{JobMode, JobSpec, TabSortOrder};
3
4impl std::fmt::Display for JobSpec {
5	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6		let name = self.name.as_deref().unwrap_or("None");
7		let desc = self.description.as_deref().unwrap_or("None");
8
9		let quiet_status = if self.quiet_work { "πŸ”‡ (Quiet)" } else { "πŸ”Š (Verbose)" };
10
11		// Helpery do kolorowania zmiennych, aby utrzymać czystość makr
12		let c_bool = |b: bool| Color::size(&b.to_string()).to_string();
13		let c_num = |n: usize| Color::size(&n.to_string()).to_string();
14
15		println!("{}", "β–‘".repeat(80));
16		// --- NAGŁÓWEK ---
17		writeln!(f, "【IDγ€‘πŸ”– [{}] | {} | {}", Color::num(&self.id), Color::folder(name), quiet_status)?;
18		writeln!(f, "  β”‚   πŸ“œ {}", Color::border(desc))?;
19		writeln!(f, "  β”‚")?;
20
21		// --- SEKCJA SCAN ---
22		writeln!(f, "  β”œβ”€β”€γ€SCAN】")?;
23		writeln!(f, "  β”‚    β”œβ”€β”€ 🎯 \"{}\"", Color::folder(&self.scan.work_path))?;
24		writeln!(f, "  β”‚    └── πŸ”Ž | πŸš«πŸ”  [{}]", c_bool(self.scan.ignore_case))?;
25
26		let pats_len = self.scan.patterns.len();
27		for (i, pat) in self.scan.patterns.iter().enumerate() {
28			let branch = if i == pats_len - 1 { "└──" } else { "β”œβ”€β”€" };
29			writeln!(f, "  β”‚        {} \"{}\"", branch, Color::border(pat))?;
30		}
31
32		writeln!(f, "  β”‚")?;
33
34		// --- SEKCJA EXPORT ---
35		writeln!(f, "  β”œβ”€β”€γ€EXPORT】")?;
36		let has_sotc = self.save_sotc_at.is_some();
37		let sotc_path = self.save_sotc_at.as_deref().unwrap_or("");
38		let sotc_title = self.title_sotc.as_deref().unwrap_or("");
39		writeln!(f, "  β”‚    β”œβ”€β”€γ€SOTCγ€‘πŸ—ƒοΈ  [{}] | πŸ’Ύ \"{}\"", c_bool(has_sotc), Color::folder(sotc_path))?;
40		writeln!(f, "  β”‚    β”‚    └── πŸ”€ \"{}\"", Color::border(sotc_title))?;
41
42		let has_cots = self.save_cots_at.is_some();
43		let cots_path = self.save_cots_at.as_deref().unwrap_or("");
44		let cots_title = self.title_cots.as_deref().unwrap_or("");
45		writeln!(f, "  β”‚    └──【COTSγ€‘πŸ“š [{}] | πŸ’Ύ \"{}\"", c_bool(has_cots), Color::folder(cots_path))?;
46		writeln!(f, "  β”‚         └── πŸ”€ \"{}\"", Color::border(cots_title))?;
47
48		writeln!(f, "  β”‚")?;
49
50		// --- SEKCJA TABLE ---
51		writeln!(f, "  β”œβ”€β”€γ€TABLE】")?;
52		let cols = self.table.columns.iter().map(|c| format!("{:?}", c)).collect::<Vec<_>>().join(", ");
53		let struct_name = format!("{:?}", self.table.structure);
54		writeln!(
55			f,
56			"  β”‚    β”œβ”€β”€ 🧩 [{}] | πŸ—οΈ  [{}] | βž• [{}]",
57			Color::size(&cols),
58			Color::size(&struct_name),
59			c_bool(self.table.more_icons)
60		)?;
61
62		let sort_by_str = format!("{:?}", self.table.sort_by).to_lowercase();
63		let sort_order_str = format!("{:?}", self.table.sort_order).to_lowercase();
64		let is_reverse = self.table.sort_order == TabSortOrder::Desc;
65		writeln!(
66			f,
67			"  β”‚    └── πŸ“Ά (\"{}\", \"{}\") | ↩️  [{}]",
68			Color::size(&sort_by_str),
69			Color::size(&sort_order_str),
70			c_bool(is_reverse)
71		)?;
72
73		writeln!(f, "  β”‚")?;
74
75		// --- SEKCJA SPEC ---
76		writeln!(f, "  └──【SPEC】")?;
77		let is_m = self.mode == JobMode::Matched;
78		let is_x = self.mode == JobMode::Mismatched;
79		writeln!(f, "       β”œβ”€β”€ βš™οΈ βœ”οΈ  Matched [{}] | βš™οΈ βœ–οΈ  Mismatched [{}]", c_bool(is_m), c_bool(is_x))?;
80		writeln!(f, "       β”œβ”€β”€ πŸ™ˆπŸ“Š [{}] | πŸ™ˆβ„ΉοΈ  [{}]", c_bool(self.hide_stats), c_bool(self.hide_promo))?;
81
82		let is_trim = self.table.trim_size.is_some();
83		let t_size = self.table.trim_size.unwrap_or(20);
84		let t_page = self.table.trim_page;
85
86		write!(f, "       └── βœ‚οΈ πŸ“ƒ [{}] | πŸ“„πŸ“ [{}] | πŸ“„πŸ‘οΈ  [{}] ", c_bool(is_trim), c_num(t_size), c_num(t_page))
87	}
88}