in src/compiler/args.rs [408:460]
fn process<F>(self, arg: &str, get_next_arg: F) -> ArgParseResult<Argument<T>>
where
F: FnOnce() -> Option<OsString>,
{
Ok(match self {
ArgInfo::Flag(s, variant) => {
debug_assert_eq!(s, arg);
Argument::Flag(s, variant)
}
ArgInfo::TakeArg(s, create, ArgDisposition::Separated) => {
debug_assert_eq!(s, arg);
if let Some(a) = get_next_arg() {
Argument::WithValue(s, create(a)?, ArgDisposition::Separated)
} else {
return Err(ArgParseError::UnexpectedEndOfArgs);
}
}
ArgInfo::TakeArg(s, create, ArgDisposition::Concatenated(d)) => {
let mut len = s.len();
debug_assert_eq!(&arg[..len], s);
if let Some(d) = d {
if arg.as_bytes().get(len) == Some(&d) {
len += 1;
}
}
Argument::WithValue(
s,
create(arg[len..].into())?,
ArgDisposition::Concatenated(d),
)
}
ArgInfo::TakeArg(s, create, ArgDisposition::CanBeSeparated(d))
| ArgInfo::TakeArg(s, create, ArgDisposition::CanBeConcatenated(d)) => {
let derived = if arg == s {
ArgInfo::TakeArg(s, create, ArgDisposition::Separated)
} else {
ArgInfo::TakeArg(s, create, ArgDisposition::Concatenated(d))
};
match derived.process(arg, get_next_arg) {
Err(ArgParseError::UnexpectedEndOfArgs) if d.is_none() => {
Argument::WithValue(s, create("".into())?, ArgDisposition::Concatenated(d))
}
Ok(Argument::WithValue(s, v, ArgDisposition::Concatenated(d))) => {
Argument::WithValue(s, v, ArgDisposition::CanBeSeparated(d))
}
Ok(Argument::WithValue(s, v, ArgDisposition::Separated)) => {
Argument::WithValue(s, v, ArgDisposition::CanBeConcatenated(d))
}
a => a?,
}
}
})
}