use super::super::tokens::{assignment_name, inert_assignment, kill_substituted};
use super::super::{ClassifyError, ShellContext, Sink, git};
use super::{SimpleCommand, filters};
use crate::action::AtomicAction;
use crate::lexer::Word;
pub(super) fn push_command(
cmd: &SimpleCommand,
argv: &[String],
program: &str,
substitution: Option<usize>,
ctx: &ShellContext<'_>,
sink: &mut Sink,
) -> Result<(), ClassifyError> {
if program == "git" {
return git::push_shell(argv, ctx, sink);
}
let mut shown = match substitution {
Some(at) => vec![
program.to_owned(),
"@substitute".to_owned(),
argv[at].clone(),
],
None => argv.to_vec(),
};
if cmd
.consumer
.as_deref()
.is_some_and(|next| filters::keeps_only_names(argv, program, next))
{
shown.push("@names-only".to_owned());
}
sink.push(AtomicAction::Shell { argv: shown })
}
pub(super) fn push_env_set(word: &Word, sink: &mut Sink) -> Result<(), ClassifyError> {
match assignment_name(&word.text) {
Some(name) if !inert_assignment(word) => sink.push(AtomicAction::EnvSet {
name: name.to_owned(),
}),
_ => Ok(()),
}
}
pub(super) fn push_kill_substituted(
program: &str,
words: &[Word],
sink: &mut Sink,
) -> Result<(), ClassifyError> {
match kill_substituted(program, words) {
Some(argv) => sink.push(AtomicAction::Shell { argv }),
None => Ok(()),
}
}