Skip to content

Commit

Permalink
feat: Expose parsed arguments to scripts using env variable
Browse files Browse the repository at this point in the history
  • Loading branch information
juanibiapina committed May 17, 2024
1 parent 47765db commit 3772de2
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 5 deletions.
6 changes: 6 additions & 0 deletions integration/fixtures/project/libexec/env-args
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# Usage: {cmd} name [-u] [--long] [args]...

set -e

echo "$_MAIN_ARGS"
9 changes: 9 additions & 0 deletions integration/sub.bats
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,12 @@ PROJECT_DIR="$SUB_TEST_DIR/project"
assert_success
assert_output "$PROJECT_DIR"
}

@test "sub: sets an env variable with argument key value pairs" {
fixture "project"

run $SUB_BIN --name main --absolute "$PROJECT_DIR" -- env-args --long pos ex1 ex2 --more

assert_success
assert_output 'name "pos" u "false" long "true" args "ex1 ex2 --more"'
}
6 changes: 1 addition & 5 deletions src/commands/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,13 @@ impl<'a> Command for FileCommand<'a> {
return Err(Error::UnknownSubCommand(self.names.last().unwrap().to_owned()));
}

// validate arguments to subcommand
let clap_command = self.usage.command();
let _ = clap_command.get_matches_from(&self.args);

// invoke subcommand
let mut command = process::Command::new(&self.path);

command.args(&self.args);

command.env(format!("_{}_ROOT", self.config.name.to_uppercase()), &self.config.root);
command.env(format!("_{}_CACHE", self.config.name.to_uppercase()), &self.config.cache_directory);
command.env(format!("_{}_ARGS", self.config.name.to_uppercase()), &self.usage.parse_into_kv(&self.args)?);

let status = command.status().unwrap();

Expand Down
1 change: 1 addition & 0 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ pub enum Error {
SubCommandInterrupted,
UnknownSubCommand(String),
InvalidUsageString(Vec<Simple<char>>),
InvalidUTF8,
}
6 changes: 6 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,12 @@ fn handle_error(config: &Config, error: Error, silent: bool) -> ! {
}
exit(1);
}
Error::InvalidUTF8 => {
if !silent {
println!("invalid UTF-8");
}
exit(1);
}
}
}

Expand Down
22 changes: 22 additions & 0 deletions src/usage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,28 @@ impl Usage {
pub fn command(&self) -> Command {
self.command.clone()
}

pub fn parse_into_kv(&self, args: &Vec<String>) -> Result<String> {
let clap_args = self.command.clone().get_matches_from(args);

let mut args_parts = Vec::<String>::new();

for arg in self.command.get_arguments() {
if let Some(values) = clap_args.get_raw(arg.get_id().as_str()) {
args_parts.push(arg.get_id().to_string());

let mut value_parts = Vec::new();

for v in values {
value_parts.push(v.to_str().ok_or(Error::InvalidUTF8)?.to_string());
}

args_parts.push(format!("\"{}\"", value_parts.join(" ")));
}
}

Ok(args_parts.join(" "))
}
}

pub fn extract_usage(config: &Config, path: &Path, cmd: &str) -> Result<Usage> {
Expand Down

0 comments on commit 3772de2

Please sign in to comment.