use crate::command_branch_mode::branch_creates;
use crate::command_branch_table::BRANCH_TABLE;
use crate::command_branch_target::{
checkout_target, creates_explicitly, guess_allowed, switch_target,
};
use crate::command_checkout_table::{CHECKOUT_TABLE, SWITCH_TABLE};
use crate::command_options::{DEFAULT_MODE, OptionError, OptionSpec, ParsedOptions, parse_options};
use crate::command_options_query::{WrapperFlags, positional_tokens, split_wrapper_flags};
use crate::escape_hatch::BRANCH_WORKTREE_ESCAPE_HATCH;
use std::ffi::OsString;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum BranchCreationCommand {
Branch,
Checkout,
Switch,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct BranchCreationRegion {
pub creates_branch: bool,
pub implicit_creation_target: Option<usize>,
pub wrapper: WrapperFlags,
}
pub fn branch_creation_command(word: &[u8]) -> Option<BranchCreationCommand> {
if word == b"branch" {
return Some(BranchCreationCommand::Branch);
}
if word == b"checkout" {
return Some(BranchCreationCommand::Checkout);
}
if word == b"switch" {
return Some(BranchCreationCommand::Switch);
}
return None;
}
pub fn parse_branch_creation_region(
command: BranchCreationCommand,
region: &[OsString],
wrapper_flags: &[&[u8]],
) -> Result<BranchCreationRegion, OptionError> {
let mut flags: Vec<&[u8]> = Vec::<&[u8]>::with_capacity(wrapper_flags.len() + 1);
flags.push(BRANCH_WORKTREE_ESCAPE_HATCH.as_bytes());
for flag in wrapper_flags {
flags.push(*flag);
}
let table: &[OptionSpec] = match command {
BranchCreationCommand::Branch => BRANCH_TABLE,
BranchCreationCommand::Checkout => CHECKOUT_TABLE,
BranchCreationCommand::Switch => SWITCH_TABLE,
};
let parsed: ParsedOptions = parse_options(region, table, DEFAULT_MODE, flags.as_slice())?;
let wrapper: WrapperFlags = split_wrapper_flags(parsed.wrapper.as_slice());
if command == BranchCreationCommand::Branch {
let names: usize = positional_tokens(&parsed, region.len()).len();
return Ok(BranchCreationRegion {
creates_branch: branch_creates(&parsed, names),
implicit_creation_target: None,
wrapper,
});
}
let creates_branch: bool = creates_explicitly(&parsed);
let mut implicit_creation_target: Option<usize> = None;
if !creates_branch && guess_allowed(&parsed) {
implicit_creation_target = if command == BranchCreationCommand::Checkout {
checkout_target(&parsed, region)
} else {
switch_target(&parsed, region)
};
}
return Ok(BranchCreationRegion {
creates_branch,
implicit_creation_target,
wrapper,
});
}
#[cfg(test)]
#[path = "command_branch_create_tests.rs"]
mod tests;
#[cfg(test)]
#[path = "command_branch_create_target_tests.rs"]
mod target_tests;
#[cfg(test)]
#[path = "command_branch_create_git_tests.rs"]
mod git_tests;
#[cfg(test)]
#[path = "command_branch_create_guess_tests.rs"]
mod guess_tests;