scriptplan_lang_utils/
lib.rs

1use std::collections::VecDeque;
2use std::sync::Arc;
3
4pub type VarArgs = VecDeque<Arc<String>>;
5
6pub fn has_parameters(args: &VarArgs) -> bool {
7  args.iter().any(|arg| (*arg).contains("$"))
8}
9
10pub fn apply_args(command_args: &VarArgs, substitutions: &VarArgs) -> VarArgs {
11  command_args
12    .iter()
13    .map(|arg| {
14        let arc = arg.clone();
15        let char_result = arc.chars().nth(0);
16        if char_result.map_or_else(|| false, |c| c == '$') && arc.len() >= 2
17        {
18            let index_string_slice = &arc[1..arc.len()];
19            if index_string_slice.chars().all(char::is_numeric) {
20                let index = index_string_slice.parse().unwrap();
21                if index < substitutions.len() {
22                    return substitutions[index].clone();
23                } else {
24                    panic!("{} was not provided", index);
25                }
26            } else {
27                return arc;
28            }
29        } else {
30            return arc;
31        }
32    })
33    .collect()
34}