use std::time::Instant;
use ratatui::widgets::ListState;
use crate::app::Picker;
use crate::aws::Event as EbEvent;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Action {
Rebuild,
RestartAppServer,
SwapCnames,
Terminate,
Deploy,
UpgradePlatform,
Clone,
Scale,
AbortUpdate,
ConfigSave,
ConfigDelete,
ConfigApply,
TerminateInstance,
}
impl Action {
pub fn label(self) -> &'static str {
match self {
Self::Rebuild => "Rebuild environment",
Self::RestartAppServer => "Restart app server",
Self::SwapCnames => "Swap CNAMEs with another env",
Self::Terminate => "Terminate environment",
Self::Deploy => "Deploy application version",
Self::UpgradePlatform => "Upgrade platform",
Self::Clone => "Clone environment",
Self::Scale => "Scale (min/max)",
Self::AbortUpdate => "Abort current update",
Self::ConfigSave => "Save configuration template",
Self::ConfigDelete => "Delete configuration template",
Self::ConfigApply => "Apply configuration template",
Self::TerminateInstance => "Terminate instance",
}
}
pub fn destructive(self) -> bool {
matches!(self, Self::Terminate)
}
pub fn glyph(self, icons: crate::theme::IconStyle) -> &'static str {
use crate::theme::IconStyle;
match (icons, self) {
(IconStyle::Powerline, Self::Rebuild) => "\u{f0450}", (IconStyle::Powerline, Self::RestartAppServer) => "\u{f0709}", (IconStyle::Powerline, Self::SwapCnames) => "\u{f0521}", (IconStyle::Powerline, Self::Terminate) => "\u{f01b4}", (IconStyle::Powerline, Self::Deploy) => "\u{f01da}", (IconStyle::Powerline, Self::UpgradePlatform) => "\u{f0140}", (IconStyle::Powerline, Self::Clone) => "\u{f018f}", (IconStyle::Powerline, Self::Scale) => "\u{f0566}", (IconStyle::Powerline, Self::AbortUpdate) => "\u{f0156}", (IconStyle::Powerline, Self::ConfigSave) => "\u{f0193}", (IconStyle::Powerline, Self::ConfigDelete) => "\u{f01b4}", (IconStyle::Powerline, Self::ConfigApply) => "\u{f00e2}", (IconStyle::Powerline, Self::TerminateInstance) => "\u{f01b4}", (IconStyle::Unicode, Self::Rebuild) => "↻",
(IconStyle::Unicode, Self::RestartAppServer) => "⟳",
(IconStyle::Unicode, Self::SwapCnames) => "⇄",
(IconStyle::Unicode, Self::Terminate) => "✗",
(IconStyle::Unicode, Self::Deploy) => "↑",
(IconStyle::Unicode, Self::UpgradePlatform) => "▲",
(IconStyle::Unicode, Self::Clone) => "❐",
(IconStyle::Unicode, Self::Scale) => "↔",
(IconStyle::Unicode, Self::AbortUpdate) => "■",
(IconStyle::Unicode, Self::ConfigSave) => "✎",
(IconStyle::Unicode, Self::ConfigDelete) => "✗",
(IconStyle::Unicode, Self::ConfigApply) => "✓",
(IconStyle::Unicode, Self::TerminateInstance) => "✗",
(IconStyle::Ascii, Self::Rebuild) => "R",
(IconStyle::Ascii, Self::RestartAppServer) => "r",
(IconStyle::Ascii, Self::SwapCnames) => "S",
(IconStyle::Ascii, Self::Terminate) => "X",
(IconStyle::Ascii, Self::Deploy) => "D",
(IconStyle::Ascii, Self::UpgradePlatform) => "U",
(IconStyle::Ascii, Self::Clone) => "C",
(IconStyle::Ascii, Self::Scale) => "N",
(IconStyle::Ascii, Self::AbortUpdate) => "A",
(IconStyle::Ascii, Self::ConfigSave) => "s",
(IconStyle::Ascii, Self::ConfigDelete) => "d",
(IconStyle::Ascii, Self::ConfigApply) => "a",
(IconStyle::Ascii, Self::TerminateInstance) => "x",
}
}
}
pub const ACTIONS: &[Action] = &[
Action::Rebuild,
Action::RestartAppServer,
Action::Deploy,
Action::UpgradePlatform,
Action::Scale,
Action::Clone,
Action::SwapCnames,
Action::AbortUpdate,
Action::Terminate,
];
pub enum ActionFlow {
Menu {
list_state: ListState,
},
SwapTarget {
source: String,
picker: Picker,
},
Confirm(ConfirmModal),
Running {
action: Action,
env: String,
since: Instant,
},
}
#[derive(Clone)]
pub struct ConfirmModal {
pub action: Action,
pub target_env: String,
pub swap_with: Option<String>,
pub typed: String,
pub kind: ConfirmKind,
pub dryrun: Option<DryRunInfo>,
pub loading_dryrun: bool,
pub recent_events: Option<Vec<EbEvent>>,
pub loading_events: bool,
pub traffic_warning: Option<String>,
pub deploy_version: Option<String>,
pub upgrade_platform_arn: Option<String>,
pub upgrade_platform_label: Option<String>,
pub clone_target: Option<String>,
pub scale_min: Option<i32>,
pub scale_max: Option<i32>,
}
#[derive(Default, Clone, Debug)]
pub struct ParameterisedAction {
pub deploy_version: Option<String>,
pub upgrade_platform_arn: Option<String>,
pub upgrade_platform_label: Option<String>,
pub clone_target: Option<String>,
pub scale_min: Option<i32>,
pub scale_max: Option<i32>,
}
#[derive(Clone, Debug)]
pub struct DryRunInfo {
pub instance_count: usize,
pub az_count: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConfirmKind {
YesNo,
TypeName, }