just/src/settings.rs

196 lines
4.9 KiB
Rust
Raw Normal View History

use super::*;
2022-01-18 11:02:15 -08:00
pub(crate) const DEFAULT_SHELL: &str = "sh";
pub(crate) const DEFAULT_SHELL_ARGS: &[&str] = &["-cu"];
pub(crate) const WINDOWS_POWERSHELL_SHELL: &str = "powershell.exe";
pub(crate) const WINDOWS_POWERSHELL_ARGS: &[&str] = &["-NoLogo", "-Command"];
2021-11-17 00:07:48 -08:00
#[derive(Debug, PartialEq, Serialize)]
pub(crate) struct Settings<'src> {
2022-02-14 18:37:06 -08:00
pub(crate) allow_duplicate_recipes: bool,
pub(crate) dotenv_load: Option<bool>,
pub(crate) export: bool,
pub(crate) positional_arguments: bool,
2022-05-31 13:01:59 -07:00
pub(crate) shell: Option<Shell<'src>>,
2022-01-18 11:02:15 -08:00
pub(crate) windows_powershell: bool,
2022-05-31 13:01:59 -07:00
pub(crate) windows_shell: Option<Shell<'src>>,
}
impl<'src> Settings<'src> {
pub(crate) fn new() -> Settings<'src> {
Settings {
2022-02-14 18:37:06 -08:00
allow_duplicate_recipes: false,
dotenv_load: None,
export: false,
positional_arguments: false,
shell: None,
2022-01-18 11:02:15 -08:00
windows_powershell: false,
2022-05-31 13:01:59 -07:00
windows_shell: None,
}
}
pub(crate) fn shell_command(&self, config: &Config) -> Command {
2022-08-08 19:50:31 -07:00
let (command, args) = self.shell(config);
2022-08-08 19:50:31 -07:00
let mut cmd = Command::new(command);
2022-08-08 19:50:31 -07:00
cmd.args(args);
2022-08-08 19:50:31 -07:00
cmd
}
2022-08-08 19:50:31 -07:00
pub(crate) fn shell<'a>(&'a self, config: &'a Config) -> (&'a str, Vec<&'a str>) {
match (&config.shell, &config.shell_args) {
(Some(shell), Some(shell_args)) => (shell, shell_args.iter().map(String::as_ref).collect()),
(Some(shell), None) => (shell, DEFAULT_SHELL_ARGS.to_vec()),
(None, Some(shell_args)) => (
DEFAULT_SHELL,
shell_args.iter().map(String::as_ref).collect(),
),
(None, None) => {
if let (true, Some(shell)) = (cfg!(windows), &self.windows_shell) {
(
shell.command.cooked.as_ref(),
shell
.arguments
.iter()
.map(|argument| argument.cooked.as_ref())
.collect(),
)
} else if cfg!(windows) && self.windows_powershell {
(WINDOWS_POWERSHELL_SHELL, WINDOWS_POWERSHELL_ARGS.to_vec())
} else if let Some(shell) = &self.shell {
(
shell.command.cooked.as_ref(),
shell
.arguments
.iter()
.map(|argument| argument.cooked.as_ref())
.collect(),
)
} else {
(DEFAULT_SHELL, DEFAULT_SHELL_ARGS.to_vec())
}
}
2022-01-18 11:02:15 -08:00
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_shell() {
let settings = Settings::new();
let config = Config {
shell_command: false,
..testing::config(&[])
};
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config), ("sh", vec!["-cu"]));
2022-01-18 11:02:15 -08:00
}
#[test]
fn default_shell_powershell() {
let mut settings = Settings::new();
settings.windows_powershell = true;
let config = Config {
shell_command: false,
..testing::config(&[])
};
if cfg!(windows) {
assert_eq!(
2022-08-08 19:50:31 -07:00
settings.shell(&config),
("powershell.exe", vec!["-NoLogo", "-Command"])
2022-01-18 11:02:15 -08:00
);
} else {
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config), ("sh", vec!["-cu"]));
2022-01-18 11:02:15 -08:00
}
}
#[test]
fn overwrite_shell() {
let settings = Settings::new();
let config = Config {
shell_command: true,
shell: Some("lol".to_string()),
shell_args: Some(vec!["-nice".to_string()]),
..testing::config(&[])
};
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config), ("lol", vec!["-nice"]));
2022-01-18 11:02:15 -08:00
}
#[test]
fn overwrite_shell_powershell() {
let mut settings = Settings::new();
settings.windows_powershell = true;
let config = Config {
shell_command: true,
shell: Some("lol".to_string()),
shell_args: Some(vec!["-nice".to_string()]),
..testing::config(&[])
};
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config), ("lol", vec!["-nice"]));
2022-01-18 11:02:15 -08:00
}
#[test]
fn shell_cooked() {
let mut settings = Settings::new();
settings.shell = Some(Shell {
command: StringLiteral {
kind: StringKind::from_token_start("\"").unwrap(),
raw: "asdf.exe",
cooked: "asdf.exe".to_string(),
},
arguments: vec![StringLiteral {
kind: StringKind::from_token_start("\"").unwrap(),
raw: "-nope",
cooked: "-nope".to_string(),
}],
});
let config = Config {
shell_command: false,
..testing::config(&[])
};
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config), ("asdf.exe", vec!["-nope"]));
2022-01-18 11:02:15 -08:00
}
#[test]
fn shell_present_but_not_shell_args() {
let mut settings = Settings::new();
settings.windows_powershell = true;
let config = Config {
shell: Some("lol".to_string()),
..testing::config(&[])
};
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config).0, "lol");
2022-01-18 11:02:15 -08:00
}
#[test]
fn shell_args_present_but_not_shell() {
let mut settings = Settings::new();
settings.windows_powershell = true;
let config = Config {
shell_command: false,
shell_args: Some(vec!["-nice".to_string()]),
..testing::config(&[])
};
2022-08-08 19:50:31 -07:00
assert_eq!(settings.shell(&config), ("sh", vec!["-nice"]));
}
}