#[must_use]
pub fn derive_crate_name(args: &[String]) -> Option<String> {
let mut i = 0;
while i < args.len() {
let a = args[i].as_str();
if let Some(rest) = a.strip_prefix("--crate-name=") {
if !rest.is_empty() {
return Some(rest.to_string());
}
} else if a == "--crate-name" {
if let Some(next) = args.get(i + 1) {
return Some(next.clone());
}
return None;
}
i += 1;
}
None
}
#[must_use]
pub fn derive_crate_type(args: &[String]) -> Option<&'static str> {
if derive_crate_name(args).as_deref() == Some("build_script_build") {
return Some("build-script");
}
let mut i = 0;
while i < args.len() {
let a = args[i].as_str();
let raw: Option<&str> = if let Some(rest) = a.strip_prefix("--crate-type=") {
Some(rest)
} else if a == "--crate-type" {
args.get(i + 1).map(String::as_str)
} else {
None
};
if let Some(raw) = raw {
let first = raw.split(',').next().unwrap_or(raw).trim();
return match first {
"lib" => Some("lib"),
"bin" => Some("bin"),
"proc-macro" | "proc_macro" => Some("proc-macro"),
"test" => Some("test"),
"bench" => Some("bench"),
"example" => Some("example"),
_ => None,
};
}
i += 1;
}
None
}
#[must_use]
pub fn derive_output_ext(crate_type: Option<&str>) -> Option<&'static str> {
match crate_type? {
"lib" => Some("rlib"),
"bin" | "build-script" | "test" | "bench" | "example" => Some("exe"),
"proc-macro" => Some("so"),
_ => None,
}
}