purple_ssh/app/
pickers.rs1use ratatui::widgets::ListState;
7
8use crate::app::App;
9use crate::app::ui_state::{AwsProfileNote, AwsProfileRow};
10
11impl App {
12 pub fn close_password_picker(&mut self) {
14 log::debug!("[purple] close_password_picker");
15 self.ui.password_picker.open = false;
16 }
17
18 pub fn close_key_picker(&mut self) {
20 log::debug!("[purple] close_key_picker");
21 self.ui.key_picker.open = false;
22 }
23
24 pub fn close_proxyjump_picker(&mut self) {
26 log::debug!("[purple] close_proxyjump_picker");
27 self.ui.proxyjump_picker.open = false;
28 }
29
30 pub fn close_vault_role_picker(&mut self) {
32 log::debug!("[purple] close_vault_role_picker");
33 self.ui.vault_role_picker.open = false;
34 }
35
36 pub fn close_region_picker(&mut self) {
38 log::debug!("[purple] close_region_picker");
39 self.ui.region_picker.open = false;
40 }
41
42 pub fn open_password_picker(&mut self) {
44 log::debug!("[purple] open_password_picker");
45 self.ui.password_picker.open = true;
46 self.ui.password_picker.list = ListState::default();
47 self.ui.password_picker.list.select(Some(0));
48 }
49
50 fn aws_profile_rows(&self) -> Vec<AwsProfileRow> {
59 let env = self.env();
60 let profiles = crate::providers::aws_profile::AwsProfiles::load(
61 env.aws_config_file().as_deref(),
62 env.aws_credentials_file().as_deref(),
63 );
64 profiles
65 .names()
66 .iter()
67 .map(|name| {
68 let note = match profiles.resolve_chain(name) {
69 Ok(chain) if !chain.roles.is_empty() => Some(AwsProfileNote {
70 text: crate::messages::PROFILE_ASSUMES_ROLE,
71 usable: true,
72 }),
73 Ok(_) => None,
74 Err(e) => Some(AwsProfileNote {
75 text: crate::providers::aws::chain_error_note(&e),
76 usable: false,
77 }),
78 };
79 AwsProfileRow {
80 name: (*name).to_string(),
81 note,
82 region: profiles
83 .get(name)
84 .map(|p| p.region.trim().to_string())
85 .unwrap_or_default(),
86 }
87 })
88 .collect()
89 }
90
91 pub fn open_profile_picker(&mut self) -> bool {
95 let rows = self.aws_profile_rows();
96 if rows.is_empty() {
97 return false;
98 }
99 log::debug!("[purple] open_profile_picker: {} profiles", rows.len());
100 self.ui.aws_profile_rows = rows;
101 self.ui.profile_picker.open = true;
102 self.ui.profile_picker.list = ListState::default();
103 self.ui.profile_picker.list.select(Some(0));
104 true
105 }
106
107 pub fn open_key_picker(&mut self) {
111 log::debug!("[purple] open_key_picker");
112 self.scan_keys();
113 self.ui.key_picker.open = true;
114 self.ui.key_picker.list = ListState::default();
115 if !self.keys.list.is_empty() {
116 self.ui.key_picker.list.select(Some(0));
117 }
118 }
119
120 pub fn open_proxyjump_picker(&mut self) {
124 log::debug!("[purple] open_proxyjump_picker");
125 self.ui.proxyjump_picker.open = true;
126 self.ui.proxyjump_picker.list = ListState::default();
127 if let Some(idx) = self.proxyjump_first_host_index() {
128 self.ui.proxyjump_picker.list.select(Some(idx));
129 }
130 }
131
132 pub fn open_vault_role_picker(&mut self) {
136 log::debug!("[purple] open_vault_role_picker");
137 self.ui.vault_role_picker.open = true;
138 self.ui.vault_role_picker.list = ListState::default();
139 self.ui.vault_role_picker.list.select(Some(0));
140 }
141
142 pub fn open_region_picker(&mut self) {
146 log::debug!("[purple] open_region_picker");
147 self.ui.region_picker.open = true;
148 self.ui.region_picker.cursor = 0;
149 }
150}