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}