use std::path::Path;
use std::process::{Command, Output};
pub fn largo() -> Command {
let exe = std::env::var_os("CARGO_BIN_EXE_largo")
.unwrap_or_else(|| env!("CARGO_BIN_EXE_largo").into());
Command::new(exe)
}
pub fn largo_in(dir: &Path, args: &[&str]) -> Output {
largo()
.args(args)
.current_dir(dir)
.output()
.expect("largo should spawn")
}
pub fn scaffold(dir: &Path, name: &str) {
std::fs::create_dir_all(dir.join("src")).unwrap();
std::fs::write(
dir.join("Largo.toml"),
format!("[package]\nname = \"{name}\"\nversion = \"0.1.0\"\nentry = \"src/main.lg\"\n"),
)
.unwrap();
std::fs::write(dir.join("src/main.lg"), "# Main\n\n## Main\n\nShow \"Hello, world!\".\n")
.unwrap();
}
pub fn strip_ansi(s: &str) -> String {
let mut out = String::with_capacity(s.len());
let mut chars = s.chars().peekable();
while let Some(c) = chars.next() {
if c == '\x1b' {
if chars.peek() == Some(&'[') {
chars.next();
for f in chars.by_ref() {
if ('\u{40}'..='\u{7e}').contains(&f) {
break;
}
}
continue;
}
continue;
}
out.push(c);
}
out
}
pub fn has_ansi(s: &str) -> bool {
s.contains('\x1b')
}
pub fn stdout(o: &Output) -> String {
String::from_utf8_lossy(&o.stdout).into_owned()
}
pub fn stderr(o: &Output) -> String {
String::from_utf8_lossy(&o.stderr).into_owned()
}