anyscript_compiler/setup/interpreter.rs
1use which::which;
2
3/// Struktur, die eine Shebang-Zeile und die zugehörigen Interpreter- und Pfadzeilen speichert.
4pub struct ReadShebang {
5 /// Die Shebang-Zeile.
6 pub shebang_line: String,
7 /// Die Interpreter-Zeile.
8 pub interpreter_line: String,
9 /// Die Pfad-Zeile.
10 pub path_line: String,
11}
12
13impl ReadShebang {
14 /// Erstellt eine neue `ReadShebang`-Instanz.
15 ///
16 /// # Argumente
17 ///
18 /// * `shebang` - Eine Zeichenkette, die die Shebang-Zeile darstellt.
19 ///
20 /// # Rückgabe
21 ///
22 /// Gibt eine neue `ReadShebang`-Instanz zurück.
23 pub fn new(shebang: String) -> Self {
24 Self {
25 shebang_line: shebang,
26 interpreter_line: String::new(),
27 path_line: String::new(),
28 }
29 }
30
31 /// Gibt die Shebang-Zeile zurück.
32 ///
33 /// # Rückgabe
34 ///
35 /// Gibt eine Referenz auf die Shebang-Zeile zurück.
36 pub fn get_shebang_line(&self) -> String {
37 self.shebang_line.clone()
38 }
39
40 /// Gibt die Interpreter-Zeile zurück.
41 ///
42 /// # Rückgabe
43 ///
44 /// Gibt eine Kopie der Interpreter-Zeile zurück und speichert sie in `self.interpreter_line`.
45 pub fn get_interpreter_line(&mut self) -> String {
46 // Erhalte die Shebang-Zeile
47 let shebang = self.get_shebang_line();
48 // Teile die Shebang-Zeile in Teile
49 let parts: Vec<&str> = shebang.split_whitespace().collect();
50
51 match parts.len() {
52 0 => String::new(),
53 1 => {
54 let interpreter_path = parts[0];
55 let interpreter_parts: Vec<&str> = interpreter_path.split('/').collect();
56 if let Some(interpreter) = interpreter_parts.last() {
57 self.interpreter_line = interpreter.to_string();
58 }
59 self.interpreter_line.clone()
60 },
61 _ => {
62 if parts[0] == "#!/usr/bin/env" {
63 self.interpreter_line = parts[1].to_string();
64 } else {
65 let interpreter_path = parts[0];
66 let interpreter_parts: Vec<&str> = interpreter_path.split('/').collect();
67 if let Some(interpreter) = interpreter_parts.last() {
68 self.interpreter_line = interpreter.to_string();
69 }
70 }
71 self.interpreter_line.clone()
72 }
73 }
74 }
75
76 /// Gibt die Pfad-Zeile zurück.
77 ///
78 /// # Rückgabe
79 ///
80 /// Gibt den Pfad zum Interpreter zurück.
81 pub fn get_path_line(&mut self) -> String {
82 // Erhalte die Interpreter-Zeile
83 let interpreter = self.get_interpreter_line();
84 // Finde den Pfad des Interpreters
85 let path = which(&interpreter).unwrap();
86 // Konvertiere den Pfad in einen String
87 path.to_str().unwrap().to_string()
88 }
89
90 /// Gibt die Pfad-Zeile zurück.
91 ///
92 /// # Rückgabe
93 ///
94 /// Gibt eine Referenz auf die Pfad-Zeile zurück.
95 pub fn get_path_line_ref(&self) -> &String {
96 &self.path_line
97 }
98}