pacsea/state/app_state/
default_impl.rs

1//! Default implementation for `AppState`.
2
3use super::AppState;
4use super::defaults;
5use super::defaults_cache;
6use std::collections::HashMap;
7
8impl Default for AppState {
9    /// What: Construct a default, empty [`AppState`] with initialized paths, selection states, and timers.
10    ///
11    /// Inputs:
12    /// - None.
13    ///
14    /// Output:
15    /// - Returns an `AppState` instance with sensible defaults for all fields.
16    ///
17    /// Details:
18    /// - Delegates initialization to helper functions that group related fields logically.
19    /// - Initializes paths for persisted data (recent searches, cache, news, install list, etc.) under the configured lists directory.
20    /// - Sets selection indices to zero, result buffers to empty, and UI flags to default visibility states.
21    /// - All repository filters default to showing everything.
22    /// - Initializes timers, scroll positions, and modal states to their default values.
23    #[allow(clippy::too_many_lines)] // Function has 652 lines - initializes large AppState struct with many fields, delegating to helper functions for logical grouping; refactoring would reduce readability
24    fn default() -> Self {
25        let (
26            recent_path,
27            cache_path,
28            news_read_path,
29            news_read_ids_path,
30            install_path,
31            official_index_path,
32            deps_cache_path,
33            files_cache_path,
34            services_cache_path,
35            announcement_read_path,
36            news_recent_path,
37            news_bookmarks_path,
38        ) = defaults::default_paths();
39        let news_feed_path = crate::theme::lists_dir().join("news_feed.json");
40        let news_content_cache_path = crate::theme::lists_dir().join("news_content_cache.json");
41        let news_seen_pkg_versions_path =
42            crate::theme::lists_dir().join("news_seen_pkg_updates.json");
43        let news_seen_aur_comments_path =
44            crate::theme::lists_dir().join("news_seen_aur_comments.json");
45        let news_seen_pkg_versions: HashMap<String, String> =
46            std::fs::read_to_string(&news_seen_pkg_versions_path)
47                .ok()
48                .and_then(|s| serde_json::from_str(&s).ok())
49                .unwrap_or_default();
50        let news_seen_aur_comments: HashMap<String, String> =
51            std::fs::read_to_string(&news_seen_aur_comments_path)
52                .ok()
53                .and_then(|s| serde_json::from_str(&s).ok())
54                .unwrap_or_default();
55
56        // Load last startup timestamp and save current timestamp
57        let last_startup_path = crate::theme::lists_dir().join("last_startup.txt");
58        let last_startup_timestamp = std::fs::read_to_string(&last_startup_path)
59            .ok()
60            .map(|s| s.trim().to_string())
61            .filter(|s| !s.is_empty());
62        // Save current timestamp for next startup
63        let current_timestamp = chrono::Local::now().format("%Y%m%d:%H%M%S").to_string();
64        let _ = std::fs::write(&last_startup_path, &current_timestamp);
65        tracing::info!(
66            previous = ?last_startup_timestamp,
67            current = %current_timestamp,
68            "startup timestamp tracking"
69        );
70
71        let (
72            results_filter_show_aur,
73            results_filter_show_core,
74            results_filter_show_extra,
75            results_filter_show_multilib,
76            results_filter_show_eos,
77            results_filter_show_cachyos,
78            results_filter_show_artix,
79            results_filter_show_artix_omniverse,
80            results_filter_show_artix_universe,
81            results_filter_show_artix_lib32,
82            results_filter_show_artix_galaxy,
83            results_filter_show_artix_world,
84            results_filter_show_artix_system,
85            filter_rects,
86        ) = defaults::default_filters();
87        let [
88            results_filter_aur_rect,
89            results_filter_core_rect,
90            results_filter_extra_rect,
91            results_filter_multilib_rect,
92            results_filter_eos_rect,
93            results_filter_cachyos_rect,
94            results_filter_artix_rect,
95            results_filter_artix_omniverse_rect,
96            results_filter_artix_universe_rect,
97            results_filter_artix_lib32_rect,
98            results_filter_artix_galaxy_rect,
99            results_filter_artix_world_rect,
100            results_filter_artix_system_rect,
101        ] = filter_rects;
102
103        let (
104            input,
105            results,
106            all_results,
107            results_backup_for_toggle,
108            selected,
109            details,
110            list_state,
111            modal,
112            previous_modal,
113            dry_run,
114            focus,
115            last_input_change,
116            last_saved_value,
117            latest_query_id,
118            next_query_id,
119            search_cache_query,
120            search_cache_fuzzy,
121            search_cache_results,
122        ) = defaults::default_search_state();
123
124        let app_mode = defaults::default_app_mode();
125
126        let (
127            news_items,
128            news_results,
129            news_loading,
130            news_ready,
131            news_selected,
132            news_list_state,
133            news_search_input,
134            news_search_caret,
135            news_search_select_anchor,
136            news_recent,
137            news_recent_path,
138            news_recent_dirty,
139            news_filter_show_arch_news,
140            news_filter_show_advisories,
141            news_filter_show_pkg_updates,
142            news_filter_show_aur_updates,
143            news_filter_show_aur_comments,
144            news_filter_installed_only,
145            news_filter_read_status,
146            news_filter_arch_rect,
147            news_filter_advisory_rect,
148            news_filter_installed_rect,
149            news_filter_updates_rect,
150            news_filter_aur_updates_rect,
151            news_filter_aur_comments_rect,
152            news_filter_read_rect,
153            news_max_age_days,
154            show_news_history_pane,
155            show_news_bookmarks_pane,
156            news_sort_mode,
157            news_bookmarks,
158            news_bookmarks_path,
159            news_bookmarks_dirty,
160            news_content_cache,
161            news_content_cache_path,
162            news_content_cache_dirty,
163            news_content,
164            news_content_loading,
165            news_content_loading_since,
166            news_content_debounce_timer,
167            news_content_scroll,
168            news_history_pending,
169            news_history_pending_at,
170            news_history_last_saved,
171        ) = defaults::default_news_feed_state(
172            news_recent_path,
173            news_bookmarks_path,
174            &news_feed_path,
175            news_content_cache_path,
176        );
177
178        let (recent, history_state, recent_path, recent_dirty) =
179            defaults::default_recent_state(recent_path);
180
181        let (details_cache, cache_path, cache_dirty) =
182            defaults::default_details_cache_state(cache_path);
183
184        let (news_read_urls, news_read_path, news_read_dirty) =
185            defaults::default_news_state(news_read_path);
186
187        let (news_read_ids, news_read_ids_path, news_read_ids_dirty) =
188            defaults::default_news_read_ids_state(news_read_ids_path);
189
190        let (announcements_read_ids, announcement_read_path, announcement_dirty) =
191            defaults::default_announcement_state(announcement_read_path);
192
193        let (
194            install_list,
195            install_state,
196            remove_list,
197            remove_state,
198            downgrade_list,
199            downgrade_state,
200            install_path,
201            install_dirty,
202            last_install_change,
203            install_list_names,
204            remove_list_names,
205            downgrade_list_names,
206        ) = defaults::default_install_lists_state(install_path);
207
208        let (show_recent_pane, show_install_pane, show_keybinds_footer, pane_find) =
209            defaults::default_ui_visibility_state();
210
211        let (search_normal_mode, fuzzy_search_enabled, search_caret, search_select_anchor) =
212            defaults::default_search_input_state();
213
214        let (official_index_path, loading_index, details_focus) =
215            defaults::default_index_state(official_index_path);
216
217        let (scroll_moves, ring_resume_at, need_ring_prefetch) =
218            defaults::default_scroll_prefetch_state();
219
220        let (
221            url_button_rect,
222            vt_url_rect,
223            install_import_rect,
224            install_export_rect,
225            arch_status_text,
226            arch_status_rect,
227            arch_status_color,
228            updates_count,
229            updates_list,
230            updates_button_rect,
231            news_button_rect,
232            updates_loading,
233            refresh_updates,
234            pending_updates_modal,
235            faillock_locked,
236            faillock_lockout_until,
237            faillock_remaining_minutes,
238        ) = defaults::default_clickable_rects_state();
239
240        let (
241            pkgb_button_rect,
242            pkgb_check_button_rect,
243            pkgb_reload_button_rect,
244            pkgb_visible,
245            pkgb_text,
246            pkgb_package_name,
247            pkgb_reload_requested_at,
248            pkgb_reload_requested_for,
249            pkgb_scroll,
250            pkgb_rect,
251        ) = defaults::default_pkgbuild_state();
252
253        let (
254            comments_button_rect,
255            comments_visible,
256            comments,
257            comments_package_name,
258            comments_fetched_at,
259            comments_scroll,
260            comments_rect,
261            comments_loading,
262            comments_error,
263            comments_urls,
264            comments_authors,
265            comments_dates,
266        ) = defaults::default_comments_state();
267
268        let (toast_message, toast_expires_at) = defaults::default_toast_state();
269
270        let (
271            layout_left_pct,
272            layout_center_pct,
273            layout_right_pct,
274            keymap,
275            locale,
276            translations,
277            translations_fallback,
278        ) = defaults::default_settings_state();
279
280        let (
281            results_rect,
282            details_rect,
283            details_scroll,
284            recent_rect,
285            install_rect,
286            downgrade_rect,
287            mouse_disabled_in_details,
288            last_mouse_pos,
289            mouse_capture_enabled,
290        ) = defaults::default_mouse_hit_test_state();
291
292        let (
293            news_rect,
294            news_list_rect,
295            announcement_rect,
296            announcement_urls,
297            pending_announcements,
298            pending_news,
299            trigger_startup_news_fetch,
300            updates_modal_rect,
301            updates_modal_content_rect,
302            help_scroll,
303            help_rect,
304            preflight_tab_rects,
305            preflight_content_rect,
306        ) = defaults::default_modal_rects_state();
307
308        let (
309            sort_mode,
310            sort_menu_open,
311            sort_button_rect,
312            news_age_button_rect,
313            sort_menu_rect,
314            sort_menu_auto_close_at,
315            options_menu_open,
316            options_button_rect,
317            options_menu_rect,
318            panels_menu_open,
319            panels_button_rect,
320            panels_menu_rect,
321            config_menu_open,
322            artix_filter_menu_open,
323            artix_filter_menu_rect,
324            config_button_rect,
325            config_menu_rect,
326            collapsed_menu_open,
327            collapsed_menu_button_rect,
328            collapsed_menu_rect,
329            sort_cache_repo_name,
330            sort_cache_aur_popularity,
331            sort_cache_signature,
332        ) = defaults::default_sorting_menus_state();
333
334        let (installed_only_mode, right_pane_focus, package_marker) =
335            defaults::default_results_mode_state();
336
337        let (
338            refresh_installed_until,
339            next_installed_refresh_at,
340            pending_install_names,
341            pending_remove_names,
342        ) = defaults_cache::default_cache_refresh_state();
343
344        let (
345            install_list_deps,
346            remove_preflight_summary,
347            remove_cascade_mode,
348            deps_resolving,
349            deps_cache_path,
350            deps_cache_dirty,
351        ) = defaults_cache::default_deps_cache_state(deps_cache_path);
352
353        let (install_list_files, files_resolving, files_cache_path, files_cache_dirty) =
354            defaults_cache::default_files_cache_state(files_cache_path);
355
356        let (
357            install_list_services,
358            services_resolving,
359            services_cache_path,
360            services_cache_dirty,
361            service_resolve_now,
362            active_service_request,
363            next_service_request_id,
364            services_pending_signature,
365            pending_service_plan,
366        ) = defaults_cache::default_services_cache_state(services_cache_path);
367
368        let (install_list_sandbox, sandbox_resolving, sandbox_cache_path, sandbox_cache_dirty) =
369            defaults_cache::default_sandbox_cache_state();
370
371        let (
372            preflight_summary_items,
373            preflight_deps_items,
374            preflight_files_items,
375            preflight_services_items,
376            preflight_sandbox_items,
377            preflight_summary_resolving,
378            preflight_deps_resolving,
379            preflight_files_resolving,
380            preflight_services_resolving,
381            preflight_sandbox_resolving,
382            last_logged_preflight_deps_state,
383            preflight_cancelled,
384        ) = defaults_cache::default_preflight_state();
385
386        Self {
387            app_mode,
388            input,
389            results,
390            all_results,
391            results_backup_for_toggle,
392            selected,
393            details,
394            list_state,
395            modal,
396            previous_modal,
397            dry_run,
398            recent,
399            history_state,
400            focus,
401            last_input_change,
402            last_saved_value,
403            recent_path,
404            recent_dirty,
405            latest_query_id,
406            next_query_id,
407            search_cache_query,
408            search_cache_fuzzy,
409            search_cache_results,
410            details_cache,
411            cache_path,
412            cache_dirty,
413            news_read_urls,
414            news_read_path,
415            news_read_dirty,
416            news_read_ids,
417            news_read_ids_path,
418            news_read_ids_dirty,
419            news_items,
420            news_results,
421            news_loading,
422            news_ready,
423            news_selected,
424            news_list_state,
425            news_search_input,
426            news_search_caret,
427            news_search_select_anchor,
428            news_recent,
429            news_recent_path,
430            news_recent_dirty,
431            news_filter_show_arch_news,
432            news_filter_show_advisories,
433            news_filter_show_pkg_updates,
434            news_filter_show_aur_updates,
435            news_filter_show_aur_comments,
436            news_filter_installed_only,
437            news_filter_read_status,
438            news_filter_arch_rect,
439            news_filter_advisory_rect,
440            news_filter_installed_rect,
441            news_filter_updates_rect,
442            news_filter_aur_updates_rect,
443            news_filter_aur_comments_rect,
444            news_filter_read_rect,
445            news_max_age_days,
446            show_news_history_pane,
447            show_news_bookmarks_pane,
448            news_sort_mode,
449            news_bookmarks,
450            news_bookmarks_path,
451            news_bookmarks_dirty,
452            news_content_cache,
453            news_content_cache_path,
454            news_content_cache_dirty,
455            news_content,
456            news_content_loading,
457            news_content_loading_since,
458            news_content_debounce_timer,
459            news_content_scroll,
460            news_feed_path,
461            news_seen_pkg_versions,
462            news_seen_pkg_versions_path,
463            news_seen_pkg_versions_dirty: false,
464            news_seen_aur_comments,
465            news_seen_aur_comments_path,
466            news_seen_aur_comments_dirty: false,
467            news_history_pending,
468            news_history_pending_at,
469            news_history_last_saved,
470            announcements_read_ids,
471            announcement_read_path,
472            announcement_dirty,
473            last_startup_timestamp,
474            last_startup_path,
475            install_list,
476            install_state,
477            remove_list,
478            remove_state,
479            downgrade_list,
480            downgrade_state,
481            install_path,
482            install_dirty,
483            last_install_change,
484            install_list_names,
485            remove_list_names,
486            downgrade_list_names,
487            show_recent_pane,
488            show_install_pane,
489            show_keybinds_footer,
490            pane_find,
491            search_normal_mode,
492            fuzzy_search_enabled,
493            search_caret,
494            search_select_anchor,
495            official_index_path,
496            loading_index,
497            details_focus,
498            scroll_moves,
499            ring_resume_at,
500            need_ring_prefetch,
501            url_button_rect,
502            vt_url_rect,
503            install_import_rect,
504            install_export_rect,
505            arch_status_text,
506            arch_status_rect,
507            arch_status_color,
508            updates_count,
509            updates_list,
510            updates_button_rect,
511            news_button_rect,
512            updates_loading,
513            refresh_updates,
514            pending_updates_modal,
515            faillock_locked,
516            faillock_lockout_until,
517            faillock_remaining_minutes,
518            pkgb_button_rect,
519            pkgb_check_button_rect,
520            pkgb_reload_button_rect,
521            pkgb_visible,
522            pkgb_text,
523            pkgb_package_name,
524            pkgb_reload_requested_at,
525            pkgb_reload_requested_for,
526            pkgb_scroll,
527            pkgb_rect,
528            comments_button_rect,
529            comments_visible,
530            comments,
531            comments_package_name,
532            comments_fetched_at,
533            comments_scroll,
534            comments_rect,
535            comments_loading,
536            comments_error,
537            comments_urls,
538            comments_authors,
539            comments_dates,
540            toast_message,
541            toast_expires_at,
542            layout_left_pct,
543            layout_center_pct,
544            layout_right_pct,
545            keymap,
546            locale,
547            translations,
548            translations_fallback,
549            results_rect,
550            details_rect,
551            details_scroll,
552            recent_rect,
553            install_rect,
554            downgrade_rect,
555            mouse_disabled_in_details,
556            last_mouse_pos,
557            mouse_capture_enabled,
558            news_rect,
559            news_list_rect,
560            announcement_rect,
561            announcement_urls,
562            pending_announcements,
563            pending_news,
564            trigger_startup_news_fetch,
565            updates_modal_rect,
566            updates_modal_content_rect,
567            help_scroll,
568            help_rect,
569            preflight_tab_rects,
570            preflight_content_rect,
571            sort_mode,
572            installed_packages_mode: crate::state::types::InstalledPackagesMode::default(),
573            sort_menu_open,
574            sort_button_rect,
575            news_age_button_rect,
576            sort_menu_rect,
577            sort_menu_auto_close_at,
578            sort_cache_repo_name,
579            sort_cache_aur_popularity,
580            sort_cache_signature,
581            options_menu_open,
582            options_button_rect,
583            options_menu_rect,
584            panels_menu_open,
585            panels_button_rect,
586            panels_menu_rect,
587            config_menu_open,
588            artix_filter_menu_open,
589            artix_filter_menu_rect,
590            config_button_rect,
591            config_menu_rect,
592            collapsed_menu_open,
593            collapsed_menu_button_rect,
594            collapsed_menu_rect,
595            installed_only_mode,
596            right_pane_focus,
597            package_marker,
598            results_filter_show_aur,
599            results_filter_show_core,
600            results_filter_show_extra,
601            results_filter_show_multilib,
602            results_filter_show_eos,
603            results_filter_show_cachyos,
604            results_filter_show_artix,
605            results_filter_show_artix_omniverse,
606            results_filter_show_artix_universe,
607            results_filter_show_artix_lib32,
608            results_filter_show_artix_galaxy,
609            results_filter_show_artix_world,
610            results_filter_show_artix_system,
611            results_filter_show_manjaro: true,
612            results_filter_aur_rect,
613            results_filter_core_rect,
614            results_filter_extra_rect,
615            results_filter_multilib_rect,
616            results_filter_eos_rect,
617            results_filter_cachyos_rect,
618            results_filter_artix_rect,
619            results_filter_artix_omniverse_rect,
620            results_filter_artix_universe_rect,
621            results_filter_artix_lib32_rect,
622            results_filter_artix_galaxy_rect,
623            results_filter_artix_world_rect,
624            results_filter_artix_system_rect,
625            results_filter_manjaro_rect: None,
626            fuzzy_indicator_rect: None,
627            refresh_installed_until,
628            next_installed_refresh_at,
629            pending_install_names,
630            pending_remove_names,
631            install_list_deps,
632            remove_preflight_summary,
633            remove_cascade_mode,
634            deps_resolving,
635            deps_cache_path,
636            deps_cache_dirty,
637            install_list_files,
638            files_resolving,
639            files_cache_path,
640            files_cache_dirty,
641            install_list_services,
642            services_resolving,
643            services_cache_path,
644            services_cache_dirty,
645            service_resolve_now,
646            active_service_request,
647            next_service_request_id,
648            services_pending_signature,
649            pending_service_plan,
650            install_list_sandbox,
651            sandbox_resolving,
652            sandbox_cache_path,
653            sandbox_cache_dirty,
654            preflight_summary_items,
655            preflight_deps_items,
656            preflight_files_items,
657            preflight_services_items,
658            preflight_sandbox_items,
659            preflight_summary_resolving,
660            preflight_deps_resolving,
661            preflight_files_resolving,
662            preflight_services_resolving,
663            preflight_sandbox_resolving,
664            last_logged_preflight_deps_state,
665            preflight_cancelled,
666            pending_executor_request: None,
667            pending_exec_header_chips: None,
668            pending_post_summary_items: None,
669            pending_custom_command: None,
670            pending_update_commands: None,
671            pending_aur_update_command: None,
672            pending_executor_password: None,
673            pending_file_sync_result: None,
674        }
675    }
676}