Skip to main content

rec/import/
bash_script.rs

1/// Parse a bash script file, extracting executable command lines.
2///
3/// Skips:
4/// - Lines starting with `#` (comments, shebangs)
5/// - Blank/whitespace-only lines
6///
7/// Each remaining line is trimmed and returned as one command.
8#[must_use]
9pub fn parse_bash_script(content: &str) -> Vec<String> {
10    content
11        .lines()
12        .map(str::trim)
13        .filter(|line| !line.is_empty() && !line.starts_with('#'))
14        .map(std::string::ToString::to_string)
15        .collect()
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21
22    #[test]
23    fn test_basic_script() {
24        let content = "#!/bin/bash\n# comment\nls -la\n\ngit status";
25        let result = parse_bash_script(content);
26        assert_eq!(result, vec!["ls -la", "git status"]);
27    }
28
29    #[test]
30    fn test_only_comments_and_blanks() {
31        let content = "#!/bin/bash\n# just a comment\n\n# another\n";
32        let result = parse_bash_script(content);
33        assert!(result.is_empty());
34    }
35
36    #[test]
37    fn test_trims_whitespace() {
38        let content = "  echo hello  \n\tls  ";
39        let result = parse_bash_script(content);
40        assert_eq!(result, vec!["echo hello", "ls"]);
41    }
42
43    #[test]
44    fn test_shebang_variants_skipped() {
45        let content = "#!/usr/bin/env bash\necho hi";
46        let result = parse_bash_script(content);
47        assert_eq!(result, vec!["echo hi"]);
48    }
49
50    #[test]
51    fn test_empty_content() {
52        let result = parse_bash_script("");
53        assert!(result.is_empty());
54    }
55}