use crate::config::global::BGitGlobalConfig;
use crate::config::local::{StepFlags, WorkflowRules};
use crate::events::AtomicEvent;
use crate::events::git_branch::GitBranch;
use crate::step::PromptStep;
use crate::step::Task::PromptStepTask;
use crate::workflows::default::prompt::pa08_ask_commit::AskCommit;
use crate::{
bgit_error::BGitError,
step::{ActionStep, Step},
};
pub(crate) struct MoveChanges {
name: String,
target_branch_name: Option<String>,
stash_message: Option<String>,
}
impl ActionStep for MoveChanges {
fn new() -> Self
where
Self: Sized,
{
MoveChanges {
name: "move_changes".to_owned(),
target_branch_name: None,
stash_message: None,
}
}
fn get_name(&self) -> &str {
&self.name
}
fn execute(
&self,
_step_config_flags: Option<&StepFlags>,
_workflow_rules_config: Option<&WorkflowRules>,
global_config: &BGitGlobalConfig,
) -> Result<Step, Box<BGitError>> {
let target_branch = match &self.target_branch_name {
Some(name) => name.clone(),
None => {
return Err(Box::new(BGitError::new(
"BGitError",
"Target branch name not provided for move changes operation",
crate::bgit_error::BGitErrorWorkflowType::ActionStep,
crate::bgit_error::NO_EVENT,
&self.name,
crate::bgit_error::NO_RULE,
)));
}
};
let mut git_branch = GitBranch::move_changes_to_branch(global_config, target_branch);
if let Some(ref message) = self.stash_message {
git_branch.set_stash_message(message.clone());
}
match git_branch.execute() {
Ok(_) => Ok(Step::Task(PromptStepTask(Box::new(AskCommit::new())))),
Err(e) => Err(e),
}
}
}
impl MoveChanges {
pub fn with_target_branch(mut self, target_branch_name: String) -> Self {
self.target_branch_name = Some(target_branch_name);
self
}
}