Skip to main content

plot/lib/mapping/
engine_cli.rs

1use std::path::PathBuf;
2
3use crate::lib::{
4	core::{print_help_for_pattern_syntax_and_semantics, print_help_for_toml_config, start, start_blank},
5	logic::file_save_safe_if_changed,
6	mapping::{prepare, translate},
7	schema::{RawCliJob, ReadyJob},
8};
9
10/// GŁÓWNY ROUTER CLI - tu zapadają decyzje i delegowane jest wykonanie potoku (callback)
11pub fn route_and_execute<F>(cli: RawCliJob, mut execute_pipeline: F)
12where F: FnMut(&ReadyJob) -> bool // ⚡ CALLBACK: Zwraca true, jeśli pipeline przeszedł bez błędów
13{
14	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
15	// 🚩 OBSŁUGA FLAGI: `-P` // POMOC
16	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
17	if cli.help_for_pattern {
18		print_help_for_pattern_syntax_and_semantics();
19		return;
20	}
21
22	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
23	// 🚩 OBSŁUGA FLAGI: `-T` // POMOC
24	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
25	if cli.help_for_config {
26		print_help_for_toml_config();
27		return;
28	}
29
30	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
31	// 🚩 OBSŁUGA FLAGI: `-L` // POMOC
32	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
33	if let Some(path_to_show) = &cli.jobs_load_only_show {
34		let path_opt = if path_to_show.is_empty() { None } else { Some(PathBuf::from(path_to_show)) };
35		let s = start(path_opt);
36		s.get_jobs(|job_raw| {
37			let desc = job_raw.description.as_deref().unwrap_or("---");
38			println!("   [ID: {}] Opis: {}", job_raw.id, desc);
39		});
40		return;
41	}
42
43	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
44	// 🚩 OBSŁUGA FLAG: `-l` oraz opcjonalnie `-t` // AUTOMATYZACJA
45	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
46	if let Some(path_to_load) = &cli.jobs_load {
47		let path_opt = if path_to_load.is_empty() { None } else { Some(PathBuf::from(path_to_load)) };
48		let s = start(path_opt);
49		let mut successful_jobs_toml = String::new();
50
51		if let Some(ids) = &cli.task_id {
52			s.get_jobs_some(ids, |job_raw| {
53				let job = prepare(job_raw.clone());
54				// ▶▶ CALLBACK Z UNIWERSALNY DLA PIPELINE
55				if execute_pipeline(&job) {
56					successful_jobs_toml.push_str("\n");
57					successful_jobs_toml.push_str(&job.insert_as_toml());
58				}
59			});
60		} else {
61			s.get_jobs(|job_raw| {
62				let job = prepare(job_raw.clone());
63				// ▶▶ CALLBACK Z UNIWERSALNY DLA PIPELINE
64				if execute_pipeline(&job) {
65					successful_jobs_toml.push_str("\n");
66					successful_jobs_toml.push_str(&job.insert_as_toml());
67				}
68			});
69		}
70
71		dump_last_successful_jobs(&s, &successful_jobs_toml);
72		return;
73	}
74
75	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
76	// 🚩 OBSŁUGA FLAGI: `-b` // MANUAL
77	// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
78	if cli.job_blank {
79		let s = start_blank(None);
80		let mut successful_jobs_toml = String::new();
81
82		if cli.speed {
83			// ----------------------------------------------------------------
84			// 🚀 SZYBKA ŚCIEŻKA MANUALNA (-b -s -d -o -p -q)
85			// ----------------------------------------------------------------
86			println!("⚙️ Tryb: SZYBKI (Fast Manual)");
87
88			s.get_jobs(|job_blank_like_raw_toml| {
89				// TODO: Tu wjedzie Twój zoptymalizowany, lekki middleware,
90				// który bierze pod uwagę TYLKO flagi b/d/o/p/q i ignoruje resztę
91				let job_raw_cli = translate(job_blank_like_raw_toml.clone(), &cli);
92				let job = prepare(job_raw_cli);
93
94				if execute_pipeline(&job) {
95					successful_jobs_toml.push_str("\n");
96					successful_jobs_toml.push_str(&job.insert_as_toml());
97				}
98			});
99		} else {
100			// ----------------------------------------------------------------
101			// 🛠️ PEŁNY MANUAL (-b -d -o -p -q i ewentualne zaawansowane modyfikatory)
102			// ----------------------------------------------------------------
103			println!("⚙️ Tryb: PEŁNY (Full Manual)");
104
105			s.get_jobs(|job_blank_like_raw_toml| {
106				let job_raw_cli = translate(job_blank_like_raw_toml.clone(), &cli);
107				let job = prepare(job_raw_cli);
108
109				if execute_pipeline(&job) {
110					successful_jobs_toml.push_str("\n");
111					successful_jobs_toml.push_str(&job.insert_as_toml());
112				}
113			});
114		}
115
116		dump_last_successful_jobs(&s, &successful_jobs_toml);
117		return;
118	}
119}
120
121// ----------------------------------------------------------------------------
122
123fn dump_last_successful_jobs(runtime: &crate::lib::core::AnchoredRuntime, jobs_toml_content: &str) {
124	// Jeśli string jest pusty, nic się nie wykonało poprawnie
125	if jobs_toml_content.is_empty() {
126		return;
127	}
128
129	let mut out_path = runtime.path_xdo().to_path_buf();
130	out_path.set_file_name("CargoPlotLast.toml");
131
132	let mut final_content = String::from("# Automatyczny zapis poprawnie wykonanych zadań (ReadyJob)\n");
133	final_content.push_str(jobs_toml_content);
134
135	// UŻYWAMY TWOJEGO GOTOWCA! Robi backup i bezpiecznie nadpisuje:
136	file_save_safe_if_changed(&out_path, &final_content);
137
138	println!("💾 Zapisano recepturę zadania.");
139	println!("📂 Ścieżka zapisu: {}", out_path.display());
140}