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}