1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use which::which;

/// Struktur, die eine Shebang-Zeile und die zugehörigen Interpreter- und Pfadzeilen speichert.
pub struct ReadShebang {
    /// Die Shebang-Zeile.
    pub shebang_line: String,
    /// Die Interpreter-Zeile.
    pub interpreter_line: String,
    /// Die Pfad-Zeile.
    pub path_line: String,
}

impl ReadShebang {
    /// Erstellt eine neue `ReadShebang`-Instanz.
    ///
    /// # Argumente
    ///
    /// * `shebang` - Eine Zeichenkette, die die Shebang-Zeile darstellt.
    ///
    /// # Rückgabe
    ///
    /// Gibt eine neue `ReadShebang`-Instanz zurück.
    pub fn new(shebang: String) -> Self {
        Self {
            shebang_line: shebang,
            interpreter_line: String::new(),
            path_line: String::new(),
        }
    }

    /// Gibt die Shebang-Zeile zurück.
    ///
    /// # Rückgabe
    ///
    /// Gibt eine Referenz auf die Shebang-Zeile zurück.
    pub fn get_shebang_line(&self) -> String {
        self.shebang_line.clone()
    }

    /// Gibt die Interpreter-Zeile zurück.
    ///
    /// # Rückgabe
    ///
    /// Gibt eine Kopie der Interpreter-Zeile zurück und speichert sie in `self.interpreter_line`.
    pub fn get_interpreter_line(&mut self) -> String {
        // Erhalte die Shebang-Zeile
        let shebang = self.get_shebang_line();
        // Teile die Shebang-Zeile in Teile
        let parts: Vec<&str> = shebang.split_whitespace().collect();
        // Wenn es mehr als ein Teil gibt, speichere den Interpreter
        if parts.len() > 1 {
            if parts[0] == "#!/usr/bin/env" {
                self.interpreter_line = parts[1].to_string();
            } else {
                let interpreter_path = parts[0];
                let interpreter_parts: Vec<&str> = interpreter_path.split('/').collect();
                if let Some(interpreter) = interpreter_parts.last() {
                    self.interpreter_line = interpreter.to_string();
                }
            }
            self.interpreter_line.clone()
        } else if parts.len() == 1 {
            let interpreter_path = parts[0];
            let interpreter_parts: Vec<&str> = interpreter_path.split('/').collect();
            if let Some(interpreter) = interpreter_parts.last() {
                self.interpreter_line = interpreter.to_string();
            }
            self.interpreter_line.clone()
        } else {
            String::new()
        }
    }

    /// Gibt die Pfad-Zeile zurück.
    ///
    /// # Rückgabe
    ///
    /// Gibt den Pfad zum Interpreter zurück.
    pub fn get_path_line(&mut self) -> String {
        // Erhalte die Interpreter-Zeile
        let interpreter = self.get_interpreter_line();
        // Finde den Pfad des Interpreters
        let path = which(&interpreter).unwrap();
        // Konvertiere den Pfad in einen String
        path.to_str().unwrap().to_string()
    }

    /// Gibt die Pfad-Zeile zurück.
    ///
    /// # Rückgabe
    ///
    /// Gibt eine Referenz auf die Pfad-Zeile zurück.
    pub fn get_path_line_ref(&self) -> &String {
        &self.path_line
    }
}