Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/cli/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::{
};

#[derive(Debug, Parser, Clone)]
#[command(name = "cargo-ndk-env")]
struct EnvArgs {
/// Triples for the target. Can be Rust or Android target names (i.e. arm64-v8a)
#[arg(short, long, env = "CARGO_NDK_TARGET")]
Expand Down Expand Up @@ -37,7 +38,7 @@ struct EnvArgs {
}

pub fn run(args: Vec<String>) -> anyhow::Result<()> {
let (mut shell, args) = init(args)?;
let (mut shell, args) = init::<EnvArgs>(args)?;
let args = EnvArgs::try_parse_from(args)?;

let (ndk_home, _ndk_detection_method) = match derive_ndk_path(&mut shell) {
Expand Down
14 changes: 9 additions & 5 deletions src/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use std::{

use anyhow::Context;
use cargo_metadata::{Artifact, CrateType, MetadataCommand, semver::Version};
use clap::{CommandFactory, Parser};
use clap::Parser;
use filetime::FileTime;

use crate::{
Expand All @@ -37,6 +37,7 @@ impl CommandExt for Command {
}

#[derive(Debug, Parser, Clone)]
#[command(name = "cargo-ndk")]
struct BuildArgs {
/// Triples for the target. Can be Rust or Android target names (i.e. arm64-v8a)
#[arg(short, long, env = "CARGO_NDK_TARGET", value_delimiter = ',')]
Expand Down Expand Up @@ -376,18 +377,21 @@ impl StringVecExt for Vec<String> {
}
}

fn init(args: Vec<String>) -> anyhow::Result<(Shell, Vec<String>)> {
fn init<T>(args: Vec<String>) -> anyhow::Result<(Shell, Vec<String>)>
where
T: clap::CommandFactory,
{
if std::env::var_os("CARGO_NDK_NO_PANIC_HOOK").is_none() {
std::panic::set_hook(Box::new(panic_hook));
}

if args.contains_str("--help") {
BuildArgs::command().print_long_help().unwrap();
T::command().print_long_help().unwrap();
std::process::exit(0);
}

if args.contains_str("-h") {
BuildArgs::command().print_help().unwrap();
T::command().print_help().unwrap();
std::process::exit(0);
}

Expand Down Expand Up @@ -435,7 +439,7 @@ fn init(args: Vec<String>) -> anyhow::Result<(Shell, Vec<String>)> {

pub fn run(args: Vec<String>) -> anyhow::Result<()> {
// Check for help/version before parsing to avoid required arg errors
let (mut shell, args) = init(args)?;
let (mut shell, args) = init::<BuildArgs>(args)?;

let args = match parse_mixed_args::<BuildArgs>(args) {
Ok(args) => args,
Expand Down
3 changes: 2 additions & 1 deletion src/cli/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::{
};

#[derive(Debug, Parser, Clone)]
#[command(name = "cargo-ndk-test")]
struct TestArgs {
/// Triples for the target. Can be Rust or Android target names (i.e. arm64-v8a)
#[arg(short, long, env = "CARGO_NDK_TARGET")]
Expand Down Expand Up @@ -56,7 +57,7 @@ impl HasCargoArgs for TestArgs {
pub fn run(args: Vec<String>) -> anyhow::Result<()> {
// Check for help/version before parsing to avoid required arg errors
let valid_args = args.split(|x| x == "--").next().unwrap_or(&args).to_vec();
let (mut shell, _) = init(valid_args)?;
let (mut shell, _) = init::<TestArgs>(valid_args)?;

let mut args = match TestArgs::try_parse_from(&args) {
Ok(args) => args,
Expand Down
30 changes: 30 additions & 0 deletions tests/cli_help.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
use std::process::Command;

fn cargo_ndk_env_help(args: &[&str]) -> String {
let output = Command::new(env!("CARGO_BIN_EXE_cargo-ndk-env"))
.env("CARGO", "cargo")
.args(args)
.output()
.expect("cargo-ndk-env should run");

assert!(
output.status.success(),
"cargo-ndk-env exited with {:?}\nstderr:\n{}",
output.status.code(),
String::from_utf8_lossy(&output.stderr)
);

String::from_utf8(output.stdout).expect("help output should be valid UTF-8")
}

#[test]
fn cargo_ndk_env_help_shows_env_format_options() {
for args in [["--help"].as_slice(), ["--", "--help"].as_slice()] {
let help = cargo_ndk_env_help(args);

assert!(help.contains("Usage: cargo-ndk-env"));
assert!(help.contains("--powershell"));
assert!(help.contains("--json"));
assert!(!help.contains("--output-dir"));
}
}
Loading