use super::{
compute_traffic_warning, parse_named_arg, parse_s3_url, Action, ActionFlow, App, ConfirmKind,
ConfirmModal, Mode, ParameterisedAction,
};
impl App {
pub(crate) fn cmd_deploy(&mut self, rest: &[&str]) {
if rest.first().copied() == Some("--from") {
let path = match rest.get(1).copied() {
Some(p) => p.to_string(),
None => {
self.error_message = Some(
"usage: :deploy --from PATH | s3://BUCKET/KEY [--label LABEL] [--describe DESC] [--no-deploy]".into(),
);
return;
}
};
let label = parse_named_arg::<String>(rest, "--label");
let description = parse_named_arg::<String>(rest, "--describe");
let no_deploy = rest.contains(&"--no-deploy");
if let Some((bucket, key)) = parse_s3_url(&path) {
self.spawn_deploy_from_s3(bucket, key, label, description, !no_deploy);
} else {
self.spawn_deploy_from_local(path, label, description, !no_deploy);
}
return;
}
match rest.first().copied() {
None => {
self.error_message = Some(
"usage: :deploy LABEL [--preview] (existing version) | :deploy --from PATH [--label L] [--describe D] [--no-deploy]".into(),
);
}
Some(version) => {
let preview = rest.contains(&"--preview");
if preview {
let Some(env) = self.selected_env().cloned() else {
self.error_message = Some("no environment selected".into());
return;
};
self.spawn_deploy_preview(env, version.to_string());
} else {
self.open_parameterised_action(
Action::Deploy,
ParameterisedAction {
deploy_version: Some(version.to_string()),
..Default::default()
},
);
}
}
}
}
pub(crate) fn cmd_upgrade(&mut self, rest: &[&str]) {
match rest.first().copied() {
None => {
let Some(env) = self.selected_env().cloned() else {
self.error_message = Some("no environment selected".into());
return;
};
self.spawn_list_compatible_platforms(env.name);
}
Some(arn) => {
self.open_parameterised_action(
Action::UpgradePlatform,
ParameterisedAction {
upgrade_platform_arn: Some(arn.to_string()),
upgrade_platform_label: Some(arn.to_string()),
..Default::default()
},
);
}
}
}
pub(crate) fn cmd_clone(&mut self, rest: &[&str]) {
match rest.first().copied() {
None => {
self.error_message =
Some("usage: :clone <new-env-name> (clones the selected env)".into());
}
Some(target) => {
self.open_parameterised_action(
Action::Clone,
ParameterisedAction {
clone_target: Some(target.to_string()),
..Default::default()
},
);
}
}
}
pub(crate) fn cmd_scale(&mut self, rest: &[&str]) {
match rest.first().copied().and_then(|s| s.parse::<i32>().ok()) {
Some(n) if n >= 0 => self.open_parameterised_action(
Action::Scale,
ParameterisedAction {
scale_min: Some(n),
scale_max: Some(n),
..Default::default()
},
),
_ => {
self.error_message =
Some("usage: :scale N (sets min=max=N; use :stop for 0)".into());
}
}
}
pub(crate) fn cmd_stop(&mut self) {
self.open_parameterised_action(
Action::Scale,
ParameterisedAction {
scale_min: Some(0),
scale_max: Some(0),
..Default::default()
},
);
}
pub(crate) fn cmd_start(&mut self) {
self.open_parameterised_action(
Action::Scale,
ParameterisedAction {
scale_min: Some(1),
scale_max: Some(1),
..Default::default()
},
);
}
pub(crate) fn cmd_abort(&mut self) {
self.open_parameterised_action(Action::AbortUpdate, ParameterisedAction::default());
}
pub(crate) fn cmd_rebuild(&mut self) {
self.open_parameterised_action(Action::Rebuild, ParameterisedAction::default());
}
pub(crate) fn cmd_restart(&mut self) {
self.open_parameterised_action(Action::RestartAppServer, ParameterisedAction::default());
}
pub(crate) fn cmd_terminate(&mut self) {
self.open_action_menu();
self.advance_action_flow(Action::Terminate);
}
pub(crate) fn cmd_swap(&mut self, rest: &[&str]) {
let Some(target) = rest.first().copied() else {
self.error_message =
Some("usage: :swap <target-env> (must be in same application)".into());
return;
};
let Some(env) = self.selected_env().cloned() else {
self.error_message = Some("no environment selected".into());
return;
};
let target = target.to_string();
let target_exists = self
.environments
.iter()
.any(|e| e.name == target && e.application == env.application);
if !target_exists {
self.error_message = Some(format!(
"swap target '{target}' not found in app '{}'",
env.application
));
return;
}
if self.read_only {
self.error_message = Some("read-only mode — swap disabled".into());
return;
}
self.action_flow = Some(ActionFlow::Confirm(ConfirmModal {
action: Action::SwapCnames,
target_env: env.name.clone(),
swap_with: Some(target),
typed: String::new(),
kind: ConfirmKind::YesNo,
dryrun: None,
loading_dryrun: false,
recent_events: None,
loading_events: false,
traffic_warning: compute_traffic_warning(&env),
deploy_version: None,
upgrade_platform_arn: None,
upgrade_platform_label: None,
clone_target: None,
scale_min: None,
scale_max: None,
}));
self.mode = Mode::Action;
}
}