use crate::command_checkout_table::{
DETACH, GUESS, NEW_BRANCH, NEW_BRANCH_FORCE, ORPHAN, OVERLAY, PATCH, STAGE, TRACK,
};
use crate::command_options::{Boundary, ParsedOptions};
use crate::command_options_query::{is_enabled, is_stated, last_occurrence, positional_tokens};
use std::ffi::OsString;
pub(crate) fn creates_explicitly(parsed: &ParsedOptions) -> bool {
return is_enabled(parsed, NEW_BRANCH)
|| is_enabled(parsed, NEW_BRANCH_FORCE)
|| is_enabled(parsed, ORPHAN)
|| is_stated(parsed, TRACK);
}
pub(crate) fn guess_allowed(parsed: &ParsedOptions) -> bool {
let mut guess: bool = true;
if let Some(stated) = last_occurrence(parsed, GUESS) {
guess = !stated.negated;
}
return guess
&& !is_enabled(parsed, PATCH)
&& !is_enabled(parsed, DETACH)
&& !is_stated(parsed, STAGE)
&& !is_stated(parsed, OVERLAY);
}
fn has_wildcard(name: &[u8]) -> bool {
for byte in name {
if *byte == b'*' || *byte == b'?' || *byte == b'[' || *byte == b'\\' {
return true;
}
}
return false;
}
pub(crate) fn checkout_target(parsed: &ParsedOptions, region: &[OsString]) -> Option<usize> {
let mut arguments: Vec<usize> = parsed.leading.clone();
let mut rest: usize = region.len();
if let Boundary::DashDash(at) = parsed.boundary {
rest = at;
}
if let Boundary::EndOfOptions(at) = parsed.boundary {
rest = at + 1;
}
while rest < region.len() {
arguments.push(rest);
rest += 1;
}
let mut separator: usize = arguments.len();
let mut position: usize = 0;
while position < arguments.len() {
if region[arguments[position]].as_encoded_bytes() == b"--" {
separator = position;
break;
}
position += 1;
}
let plain: bool = arguments.len() == 1 && separator == 1;
let separated: bool = arguments.len() == 2 && separator == 1;
if !plain && !separated {
return None;
}
let name: &[u8] = region[arguments[0]].as_encoded_bytes();
if name == b"-" || (plain && has_wildcard(name)) {
return None;
}
return Some(arguments[0]);
}
pub(crate) fn switch_target(parsed: &ParsedOptions, region: &[OsString]) -> Option<usize> {
let arguments: Vec<usize> = positional_tokens(parsed, region.len());
if arguments.len() != 1 {
return None;
}
if region[arguments[0]].as_encoded_bytes() == b"-" {
return None;
}
return Some(arguments[0]);
}