rusticity_term/lambda/
applications.rs1use crate::app::App;
2use crate::common::{CyclicEnum, InputFocus};
3use crate::ui::lambda::{
4 filtered_lambda_applications, ApplicationDetailTab as LambdaApplicationDetailTab,
5 FILTER_CONTROLS,
6};
7
8pub fn next_item(app: &mut App) {
11 if app.lambda_application_state.current_application.is_some() {
12 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Overview {
13 let len = app.lambda_application_state.resources.items.len();
14 if len > 0 {
15 app.lambda_application_state.resources.next_item(len);
16 }
17 } else {
18 let len = app.lambda_application_state.deployments.items.len();
19 if len > 0 {
20 app.lambda_application_state.deployments.next_item(len);
21 }
22 }
23 } else {
24 let filtered = filtered_lambda_applications(app);
25 if !filtered.is_empty() {
26 app.lambda_application_state.table.selected =
27 (app.lambda_application_state.table.selected + 1).min(filtered.len() - 1);
28 app.lambda_application_state.table.snap_to_page();
29 }
30 }
31}
32
33pub fn prev_item(app: &mut App) {
34 if app.lambda_application_state.current_application.is_some()
35 && app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Overview
36 {
37 app.lambda_application_state.resources.selected = app
38 .lambda_application_state
39 .resources
40 .selected
41 .saturating_sub(1);
42 } else if app.lambda_application_state.current_application.is_some()
43 && app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments
44 {
45 app.lambda_application_state.deployments.selected = app
46 .lambda_application_state
47 .deployments
48 .selected
49 .saturating_sub(1);
50 } else {
51 app.lambda_application_state.table.selected = app
52 .lambda_application_state
53 .table
54 .selected
55 .saturating_sub(1);
56 app.lambda_application_state.table.snap_to_page();
57 }
58}
59
60pub fn page_down_filter_input(app: &mut App) {
61 if app.lambda_application_state.current_application.is_some() {
62 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
63 let page_size = app.lambda_application_state.deployments.page_size.value();
64 let filtered_count = app.lambda_application_state.deployments.items.len();
65 app.lambda_application_state
66 .deployment_input_focus
67 .handle_page_down(
68 &mut app.lambda_application_state.deployments.selected,
69 &mut app.lambda_application_state.deployments.scroll_offset,
70 page_size,
71 filtered_count,
72 );
73 } else {
74 let page_size = app.lambda_application_state.resources.page_size.value();
75 let filtered_count = app.lambda_application_state.resources.items.len();
76 app.lambda_application_state
77 .resource_input_focus
78 .handle_page_down(
79 &mut app.lambda_application_state.resources.selected,
80 &mut app.lambda_application_state.resources.scroll_offset,
81 page_size,
82 filtered_count,
83 );
84 }
85 } else {
86 let page_size = app.lambda_application_state.table.page_size.value();
87 let filtered_count = filtered_lambda_applications(app).len();
88 app.lambda_application_state.input_focus.handle_page_down(
89 &mut app.lambda_application_state.table.selected,
90 &mut app.lambda_application_state.table.scroll_offset,
91 page_size,
92 filtered_count,
93 );
94 }
95}
96
97pub fn page_down_normal(app: &mut App) {
98 let len = filtered_lambda_applications(app).len();
99 app.lambda_application_state.table.page_down(len);
100}
101
102pub fn page_up_filter_input(app: &mut App) {
103 if app.lambda_application_state.current_application.is_some() {
104 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
105 let page_size = app.lambda_application_state.deployments.page_size.value();
106 app.lambda_application_state
107 .deployment_input_focus
108 .handle_page_up(
109 &mut app.lambda_application_state.deployments.selected,
110 &mut app.lambda_application_state.deployments.scroll_offset,
111 page_size,
112 );
113 } else {
114 let page_size = app.lambda_application_state.resources.page_size.value();
115 app.lambda_application_state
116 .resource_input_focus
117 .handle_page_up(
118 &mut app.lambda_application_state.resources.selected,
119 &mut app.lambda_application_state.resources.scroll_offset,
120 page_size,
121 );
122 }
123 } else {
124 let page_size = app.lambda_application_state.table.page_size.value();
125 app.lambda_application_state.input_focus.handle_page_up(
126 &mut app.lambda_application_state.table.selected,
127 &mut app.lambda_application_state.table.scroll_offset,
128 page_size,
129 );
130 }
131}
132
133pub fn page_up_normal(app: &mut App) {
134 app.lambda_application_state.table.page_up();
135}
136
137pub fn expand_row(app: &mut App) {
138 if app.lambda_application_state.current_application.is_some() {
139 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Overview {
140 app.lambda_application_state.resources.toggle_expand();
141 } else {
142 app.lambda_application_state.deployments.toggle_expand();
143 }
144 } else {
145 app.lambda_application_state.table.expand();
146 }
147}
148
149pub fn prev_pane(app: &mut App) {
150 if app.lambda_application_state.current_application.is_some() {
151 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Overview {
152 app.lambda_application_state.resources.collapse();
153 } else {
154 app.lambda_application_state.deployments.collapse();
155 }
156 } else if app.lambda_application_state.table.has_expanded_item() {
157 app.lambda_application_state.table.collapse();
158 }
159}
160
161pub fn go_to_page(app: &mut App, page: usize) {
162 let filtered_count = filtered_lambda_applications(app).len();
163 app.lambda_application_state
164 .table
165 .goto_page(page, filtered_count);
166}
167
168pub fn apply_filter_reset(app: &mut App) {
171 if app.lambda_application_state.current_application.is_some() {
172 app.lambda_application_state.deployments.reset();
173 app.lambda_application_state.resources.reset();
174 } else {
175 app.lambda_application_state.table.reset();
176 }
177}
178
179pub fn start_filter(app: &mut App) {
180 if app.lambda_application_state.current_application.is_some() {
181 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Overview {
182 app.lambda_application_state.resource_input_focus = InputFocus::Filter;
183 } else {
184 app.lambda_application_state.deployment_input_focus = InputFocus::Filter;
185 }
186 } else {
187 app.lambda_application_state.input_focus = InputFocus::Filter;
188 }
189}
190
191pub fn is_pagination_focused(app: &App) -> bool {
192 if app.lambda_application_state.current_application.is_some() {
193 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
194 app.lambda_application_state.deployment_input_focus == InputFocus::Pagination
195 } else {
196 app.lambda_application_state.resource_input_focus == InputFocus::Pagination
197 }
198 } else {
199 app.lambda_application_state.input_focus == InputFocus::Pagination
200 }
201}
202
203pub fn is_filter_focused(app: &App) -> bool {
204 if app.lambda_application_state.current_application.is_some() {
205 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
206 app.lambda_application_state.deployment_input_focus == InputFocus::Filter
207 } else {
208 app.lambda_application_state.resource_input_focus == InputFocus::Filter
209 }
210 } else {
211 app.lambda_application_state.input_focus == InputFocus::Filter
212 }
213}
214
215pub fn next_filter_focus(app: &mut App) {
216 if app.lambda_application_state.current_application.is_some() {
217 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
218 app.lambda_application_state.deployment_input_focus = app
219 .lambda_application_state
220 .deployment_input_focus
221 .next(&FILTER_CONTROLS);
222 } else {
223 app.lambda_application_state.resource_input_focus = app
224 .lambda_application_state
225 .resource_input_focus
226 .next(&FILTER_CONTROLS);
227 }
228 } else {
229 app.lambda_application_state.input_focus = app
230 .lambda_application_state
231 .input_focus
232 .next(&FILTER_CONTROLS);
233 }
234}
235
236pub fn prev_filter_focus(app: &mut App) {
237 if app.lambda_application_state.current_application.is_some() {
238 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
239 app.lambda_application_state.deployment_input_focus = app
240 .lambda_application_state
241 .deployment_input_focus
242 .prev(&FILTER_CONTROLS);
243 } else {
244 app.lambda_application_state.resource_input_focus = app
245 .lambda_application_state
246 .resource_input_focus
247 .prev(&FILTER_CONTROLS);
248 }
249 } else {
250 app.lambda_application_state.input_focus = app
251 .lambda_application_state
252 .input_focus
253 .prev(&FILTER_CONTROLS);
254 }
255}
256
257pub fn select_item(app: &mut App) {
260 if app.lambda_application_state.current_application.is_some() {
261 return; }
263 let filtered = filtered_lambda_applications(app);
264 if let Some(app_item) = app.lambda_application_state.table.get_selected(&filtered) {
265 let app_name = app_item.name.clone();
266 app.lambda_application_state.current_application = Some(app_name.clone());
267 app.lambda_application_state.detail_tab = LambdaApplicationDetailTab::Overview;
268
269 use crate::lambda::{Deployment, Resource};
270 app.lambda_application_state.resources.items = vec![
271 Resource {
272 logical_id: "ApiGatewayRestApi".to_string(),
273 physical_id: "abc123xyz".to_string(),
274 resource_type: "AWS::ApiGateway::RestApi".to_string(),
275 last_modified: "2025-01-10 14:30:00 (UTC)".to_string(),
276 },
277 Resource {
278 logical_id: "LambdaFunction".to_string(),
279 physical_id: format!("{}-function", app_name),
280 resource_type: "AWS::Lambda::Function".to_string(),
281 last_modified: "2025-01-10 14:25:00 (UTC)".to_string(),
282 },
283 Resource {
284 logical_id: "DynamoDBTable".to_string(),
285 physical_id: format!("{}-table", app_name),
286 resource_type: "AWS::DynamoDB::Table".to_string(),
287 last_modified: "2025-01-09 10:15:00 (UTC)".to_string(),
288 },
289 ];
290 app.lambda_application_state.deployments.items = vec![Deployment {
291 deployment_id: "d-ABC123XYZ".to_string(),
292 resource_type: "AWS::Serverless::Application".to_string(),
293 last_updated: "2025-01-10 14:30:00 (UTC)".to_string(),
294 status: "Succeeded".to_string(),
295 }];
296 app.update_current_tab_breadcrumb();
297 }
298}
299
300pub fn go_back(app: &mut App) {
301 app.lambda_application_state.current_application = None;
302 app.update_current_tab_breadcrumb();
303}
304
305pub fn next_detail_tab(app: &mut App) {
306 app.lambda_application_state.detail_tab = app.lambda_application_state.detail_tab.next();
307}
308
309pub fn prev_detail_tab(app: &mut App) {
310 app.lambda_application_state.detail_tab = app.lambda_application_state.detail_tab.prev();
311}
312
313pub fn refresh(app: &mut App) {
314 app.lambda_application_state.table.loading = true;
315}
316
317pub fn toggle_column(app: &mut App) {
320 crate::preferences::bindings::activate_for(app, crate::app::Service::LambdaApplications);
321}
322
323pub fn next_preferences(app: &mut App) {
324 crate::preferences::bindings::move_section_for(
325 app,
326 crate::app::Service::LambdaApplications,
327 true,
328 );
329}
330
331pub fn prev_preferences(app: &mut App) {
332 crate::preferences::bindings::move_section_for(
333 app,
334 crate::app::Service::LambdaApplications,
335 false,
336 );
337}
338
339pub fn column_selector_max(app: &App) -> usize {
340 crate::preferences::bindings::model_for(app, crate::app::Service::LambdaApplications)
341 .max_index()
342}
343
344pub fn column_count(app: &App) -> usize {
345 crate::preferences::bindings::model_for(app, crate::app::Service::LambdaApplications)
346 .column_count()
347}
348
349pub fn breadcrumb() -> Vec<String> {
352 vec!["Lambda".to_string(), "Applications".to_string()]
353}
354
355pub fn console_url(app: &App) -> String {
356 use crate::lambda;
357 if let Some(app_name) = &app.lambda_application_state.current_application {
358 lambda::console_url_application_detail(
359 &app.config.region,
360 app_name,
361 &app.lambda_application_state.detail_tab,
362 )
363 } else {
364 lambda::console_url_applications(&app.config.region)
365 }
366}
367
368pub fn get_active_filter_mut(app: &mut App) -> Option<&mut String> {
369 if app.lambda_application_state.current_application.is_some() {
370 if app.lambda_application_state.detail_tab == LambdaApplicationDetailTab::Deployments {
371 Some(&mut app.lambda_application_state.deployments.filter)
372 } else {
373 Some(&mut app.lambda_application_state.resources.filter)
374 }
375 } else {
376 Some(&mut app.lambda_application_state.table.filter)
377 }
378}