2019-12-07 03:09:21 -08:00
|
|
|
pub(crate) struct Shebang<'line> {
|
|
|
|
pub(crate) interpreter: &'line str,
|
|
|
|
pub(crate) argument: Option<&'line str>,
|
2017-11-16 23:30:08 -08:00
|
|
|
}
|
|
|
|
|
2019-12-07 03:09:21 -08:00
|
|
|
impl<'line> Shebang<'line> {
|
|
|
|
pub(crate) fn new(line: &'line str) -> Option<Shebang<'line>> {
|
|
|
|
if !line.starts_with("#!") {
|
2017-11-16 23:30:08 -08:00
|
|
|
return None;
|
|
|
|
}
|
|
|
|
|
2019-12-07 03:09:21 -08:00
|
|
|
let mut pieces = line[2..]
|
2017-11-16 23:30:08 -08:00
|
|
|
.lines()
|
|
|
|
.nth(0)
|
|
|
|
.unwrap_or("")
|
|
|
|
.trim()
|
|
|
|
.splitn(2, |c| c == ' ' || c == '\t');
|
|
|
|
|
|
|
|
let interpreter = pieces.next().unwrap_or("");
|
2018-12-08 14:29:41 -08:00
|
|
|
let argument = pieces.next();
|
2017-11-16 23:30:08 -08:00
|
|
|
|
|
|
|
if interpreter == "" {
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
|
2018-12-08 14:29:41 -08:00
|
|
|
Some(Shebang {
|
|
|
|
interpreter,
|
|
|
|
argument,
|
|
|
|
})
|
2017-11-16 23:30:08 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
2019-11-07 10:55:15 -08:00
|
|
|
mod tests {
|
2017-11-16 23:30:08 -08:00
|
|
|
use super::Shebang;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn split_shebang() {
|
|
|
|
fn check(text: &str, expected_split: Option<(&str, Option<&str>)>) {
|
|
|
|
let shebang = Shebang::new(text);
|
2018-12-08 14:29:41 -08:00
|
|
|
assert_eq!(
|
|
|
|
shebang.map(|shebang| (shebang.interpreter, shebang.argument)),
|
|
|
|
expected_split
|
|
|
|
);
|
2017-11-16 23:30:08 -08:00
|
|
|
}
|
|
|
|
|
2018-12-08 14:29:41 -08:00
|
|
|
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);
|
2017-11-16 23:30:08 -08:00
|
|
|
}
|
|
|
|
}
|