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
pub(crate) struct Shebang<'line> { pub(crate) interpreter: &'line str, pub(crate) argument: Option<&'line str>, } impl<'line> Shebang<'line> { pub(crate) fn new(line: &'line str) -> Option<Shebang<'line>> { if !line.starts_with("#!") { return None; } let mut pieces = line[2..] .lines() .nth(0) .unwrap_or("") .trim() .splitn(2, |c| c == ' ' || c == '\t'); let interpreter = pieces.next().unwrap_or(""); let argument = pieces.next(); if interpreter == "" { return None; } Some(Shebang { interpreter, argument, }) } } #[cfg(test)] mod tests { use super::Shebang; #[test] fn split_shebang() { fn check(text: &str, expected_split: Option<(&str, Option<&str>)>) { let shebang = Shebang::new(text); assert_eq!( shebang.map(|shebang| (shebang.interpreter, shebang.argument)), expected_split ); } check("#! ", None); check("#!", None); check("#!/bin/bash", Some(("/bin/bash", None))); check("#!/bin/bash ", Some(("/bin/bash", None))); check( "#!/usr/bin/env python", Some(("/usr/bin/env", Some("python"))), ); check( "#!/usr/bin/env python ", Some(("/usr/bin/env", Some("python"))), ); check( "#!/usr/bin/env python -x", Some(("/usr/bin/env", Some("python -x"))), ); check( "#!/usr/bin/env python -x", Some(("/usr/bin/env", Some("python -x"))), ); check( "#!/usr/bin/env python \t-x\t", Some(("/usr/bin/env", Some("python \t-x"))), ); check("#/usr/bin/env python \t-x\t", None); check("#! /bin/bash", Some(("/bin/bash", None))); check("#!\t\t/bin/bash ", Some(("/bin/bash", None))); check( "#! \t\t/usr/bin/env python", Some(("/usr/bin/env", Some("python"))), ); check( "#! /usr/bin/env python ", Some(("/usr/bin/env", Some("python"))), ); check( "#! /usr/bin/env python -x", Some(("/usr/bin/env", Some("python -x"))), ); check( "#! /usr/bin/env python -x", Some(("/usr/bin/env", Some("python -x"))), ); check( "#! /usr/bin/env python \t-x\t", Some(("/usr/bin/env", Some("python \t-x"))), ); check("# /usr/bin/env python \t-x\t", None); } }