Skip to main content

plot/lib/logic/
path_context.rs

1/// ============================================================================
2/// PATH CONTEXT (ZERO-COPY / STACK-BASED)
3/// ============================================================================
4///
5/// Reprezentuje semantyczny podział ścieżki na część katalogową (parent)
6/// oraz nazwę pliku (file). Działa w 100% na pożyczonych referencjach (zero
7/// alokacji na stercie).
8
9#[derive(Debug, Clone)]
10pub struct PathContext<'a> {
11	pub parent: &'a str,
12	pub file: &'a str,
13}
14
15impl<'a> PathContext<'a> {
16	/// Tworzy kontekst z surowej ścieżki tekstowej bez kopiowania pamięci.
17	pub fn from(path: &'a str) -> Self {
18		let clean_path = path.trim_start_matches("./");
19
20		// Zamiast tworzyć wektory i łączyć stringi, robimy matematykę na indeksach
21		// (super szybkie!)
22		let (parent, file) = match clean_path.rfind('/') {
23			Some(idx) => {
24				// Odcinamy wszystko do ostatniego ukośnika (to jest parent)
25				// i wszystko po nim (to jest file)
26				(&clean_path[..idx], &clean_path[idx + 1..])
27			}
28			None => {
29				// Brak ukośnika - plik jest w katalogu głównym
30				("", clean_path)
31			}
32		};
33
34		Self { parent, file }
35	}
36
37	pub fn name(&self) -> &'a str { self.file }
38
39	pub fn parent(&self) -> &'a str { self.parent }
40
41	pub fn is_root_level(&self) -> bool { self.parent.is_empty() }
42
43	// Zauważ: usunąłem funkcję `full()`, bo wymuszałaby znowu łączenie stringów
44	// (alokację). Jeśli silnik DSL jej nie używa, wywalamy ją dla bezpieczeństwa.
45}