use crate::app::context_clues::{ BLOCKLIST_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, HISTORY_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, }; use crate::app::radarr::radarr_context_clues::{ COLLECTIONS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, }; use crate::models::radarr_models::{ AddMovieSearchResult, BlocklistItem, Collection, CollectionMovie, DownloadRecord, IndexerSettings, Movie, RadarrHistoryItem, RadarrTask, }; use crate::models::servarr_data::modals::{EditIndexerModal, IndexerTestResultModalItem}; use crate::models::servarr_data::radarr::modals::{ AddMovieModal, EditCollectionModal, EditMovieModal, MovieDetailsModal, }; use crate::models::servarr_models::{DiskSpace, Indexer, QueueEvent, RootFolder}; use crate::models::stateful_list::StatefulList; use crate::models::stateful_table::StatefulTable; use crate::models::{ BlockSelectionState, HorizontallyScrollableText, Route, ScrollableText, TabRoute, TabState, }; use crate::network::radarr_network::RadarrEvent; use bimap::BiMap; use chrono::{DateTime, Utc}; use itertools::Itertools; use serde_json::Number; use strum::EnumIter; #[cfg(test)] use { crate::models::radarr_models::{MinimumAvailability, MovieMonitor}, crate::models::stateful_table::SortOption, crate::network::radarr_network::radarr_network_test_utils::test_utils::root_folder, crate::network::radarr_network::radarr_network_test_utils::test_utils::{ add_movie_search_result, blocklist_item, cast_credit, collection, collection_movie, crew_credit, download_record, indexer, log_line, movie, movie_history_item, quality_profile_map, radarr_history_item, tags_map, task, torrent_release, updates, usenet_release, }, crate::network::servarr_test_utils::diskspace, crate::network::servarr_test_utils::indexer_test_result, crate::network::servarr_test_utils::queued_event, crate::sort_option, strum::IntoEnumIterator, strum_macros::{Display, EnumString}, }; #[cfg(test)] #[path = "radarr_data_tests.rs"] mod radarr_data_tests; #[cfg(test)] #[path = "radarr_test_utils.rs"] pub mod radarr_test_utils; pub struct RadarrData<'a> { pub root_folders: StatefulTable, pub disk_space_vec: Vec, pub version: String, pub start_time: DateTime, pub movies: StatefulTable, pub selected_block: BlockSelectionState<'a, ActiveRadarrBlock>, pub downloads: StatefulTable, pub indexers: StatefulTable, pub blocklist: StatefulTable, pub history: StatefulTable, pub quality_profile_map: BiMap, pub tags_map: BiMap, pub collections: StatefulTable, pub collection_movies: StatefulTable, pub logs: StatefulList, pub log_details: StatefulList, pub tasks: StatefulTable, pub queued_events: StatefulTable, pub updates: ScrollableText, pub main_tabs: TabState, pub movie_info_tabs: TabState, pub add_movie_search: Option, pub add_movie_modal: Option, pub add_searched_movies: Option>, pub edit_movie_modal: Option, pub edit_collection_modal: Option, pub edit_indexer_modal: Option, pub edit_root_folder: Option, pub indexer_settings: Option, pub indexer_test_errors: Option, pub indexer_test_all_results: Option>, pub movie_details_modal: Option, pub prompt_confirm: bool, pub prompt_confirm_action: Option, pub delete_movie_files: bool, pub add_list_exclusion: bool, } impl RadarrData<'_> { pub fn reset_delete_movie_preferences(&mut self) { self.delete_movie_files = false; self.add_list_exclusion = false; } pub fn reset_movie_info_tabs(&mut self) { self.movie_details_modal = None; self.movie_info_tabs.index = 0; } pub fn tag_ids_to_display(&self, tag_ids: &[Number]) -> String { tag_ids .iter() .filter_map(|tag_id| { let id = tag_id.as_i64()?; self.tags_map.get_by_left(&id).cloned() }) .collect::>() .join(", ") } pub fn sorted_quality_profile_names(&self) -> Vec { self .quality_profile_map .iter() .sorted_by_key(|(id, _)| *id) .map(|(_, name)| name) .cloned() .collect() } } impl<'a> Default for RadarrData<'a> { fn default() -> RadarrData<'a> { RadarrData { root_folders: StatefulTable::default(), disk_space_vec: Vec::new(), version: String::new(), start_time: DateTime::default(), movies: StatefulTable::default(), selected_block: BlockSelectionState::default(), downloads: StatefulTable::default(), indexers: StatefulTable::default(), blocklist: StatefulTable::default(), history: StatefulTable::default(), quality_profile_map: BiMap::default(), tags_map: BiMap::default(), collections: StatefulTable::default(), collection_movies: StatefulTable::default(), logs: StatefulList::default(), log_details: StatefulList::default(), tasks: StatefulTable::default(), queued_events: StatefulTable::default(), updates: ScrollableText::default(), add_movie_search: None, add_movie_modal: None, add_searched_movies: None, edit_movie_modal: None, edit_collection_modal: None, edit_indexer_modal: None, edit_root_folder: None, indexer_settings: None, indexer_test_errors: None, indexer_test_all_results: None, movie_details_modal: None, prompt_confirm: false, prompt_confirm_action: None, delete_movie_files: false, add_list_exclusion: false, main_tabs: TabState::new(vec![ TabRoute { title: "Library".to_string(), route: ActiveRadarrBlock::Movies.into(), contextual_help: Some(&LIBRARY_CONTEXT_CLUES), config: None, }, TabRoute { title: "Collections".to_string(), route: ActiveRadarrBlock::Collections.into(), contextual_help: Some(&COLLECTIONS_CONTEXT_CLUES), config: None, }, TabRoute { title: "Downloads".to_string(), route: ActiveRadarrBlock::Downloads.into(), contextual_help: Some(&DOWNLOADS_CONTEXT_CLUES), config: None, }, TabRoute { title: "Blocklist".to_string(), route: ActiveRadarrBlock::Blocklist.into(), contextual_help: Some(&BLOCKLIST_CONTEXT_CLUES), config: None, }, TabRoute { title: "History".to_string(), route: ActiveRadarrBlock::History.into(), contextual_help: Some(&HISTORY_CONTEXT_CLUES), config: None, }, TabRoute { title: "Root Folders".to_string(), route: ActiveRadarrBlock::RootFolders.into(), contextual_help: Some(&ROOT_FOLDERS_CONTEXT_CLUES), config: None, }, TabRoute { title: "Indexers".to_string(), route: ActiveRadarrBlock::Indexers.into(), contextual_help: Some(&INDEXERS_CONTEXT_CLUES), config: None, }, TabRoute { title: "System".to_string(), route: ActiveRadarrBlock::System.into(), contextual_help: Some(&SYSTEM_CONTEXT_CLUES), config: None, }, ]), movie_info_tabs: TabState::new(vec![ TabRoute { title: "Details".to_string(), route: ActiveRadarrBlock::MovieDetails.into(), contextual_help: Some(&MOVIE_DETAILS_CONTEXT_CLUES), config: None, }, TabRoute { title: "History".to_string(), route: ActiveRadarrBlock::MovieHistory.into(), contextual_help: Some(&MOVIE_DETAILS_CONTEXT_CLUES), config: None, }, TabRoute { title: "File".to_string(), route: ActiveRadarrBlock::FileInfo.into(), contextual_help: Some(&MOVIE_DETAILS_CONTEXT_CLUES), config: None, }, TabRoute { title: "Cast".to_string(), route: ActiveRadarrBlock::Cast.into(), contextual_help: Some(&MOVIE_DETAILS_CONTEXT_CLUES), config: None, }, TabRoute { title: "Crew".to_string(), route: ActiveRadarrBlock::Crew.into(), contextual_help: Some(&MOVIE_DETAILS_CONTEXT_CLUES), config: None, }, TabRoute { title: "Manual Search".to_string(), route: ActiveRadarrBlock::ManualSearch.into(), contextual_help: Some(&MANUAL_MOVIE_SEARCH_CONTEXT_CLUES), config: None, }, ]), } } } #[cfg(test)] impl RadarrData<'_> { pub fn test_default_fully_populated() -> Self { let quality_profile_name = "HD - 1080p".to_owned(); let mut add_movie_modal = AddMovieModal { tags: "alex".into(), ..AddMovieModal::default() }; add_movie_modal .root_folder_list .set_items(vec![root_folder()]); add_movie_modal .monitor_list .set_items(MovieMonitor::iter().collect()); add_movie_modal .minimum_availability_list .set_items(MinimumAvailability::iter().collect()); add_movie_modal .quality_profile_list .set_items(vec![quality_profile_name.clone()]); let mut add_movie_search_result_table = StatefulTable::default(); add_movie_search_result_table.set_items(vec![add_movie_search_result()]); add_movie_search_result_table.sorting(vec![sort_option!(tmdb_id)]); add_movie_search_result_table.search = Some("something".into()); add_movie_search_result_table.filter = Some("something".into()); let mut edit_movie_modal = EditMovieModal { monitored: Some(true), path: "/nfs/movies".into(), tags: "alex".into(), ..EditMovieModal::default() }; edit_movie_modal .minimum_availability_list .set_items(MinimumAvailability::iter().collect()); edit_movie_modal .quality_profile_list .set_items(vec![quality_profile_name.clone()]); let mut edit_collection_modal = EditCollectionModal { monitored: Some(true), path: "/nfs/movies".into(), search_on_add: Some(true), ..EditCollectionModal::default() }; edit_collection_modal .minimum_availability_list .set_items(MinimumAvailability::iter().collect()); edit_collection_modal .quality_profile_list .set_items(vec![quality_profile_name.clone()]); let edit_indexer_modal = EditIndexerModal { name: "DrunkenSlug".into(), enable_rss: Some(true), enable_automatic_search: Some(true), enable_interactive_search: Some(true), url: "http://127.0.0.1:9696/1/".into(), api_key: "someApiKey".into(), seed_ratio: "ratio".into(), tags: "25".into(), priority: 1, }; let indexer_settings = IndexerSettings { allow_hardcoded_subs: true, availability_delay: 0, id: 1, maximum_size: 1234, minimum_age: 12, prefer_indexer_flags: true, retention: 30, rss_sync_interval: 60, whitelisted_hardcoded_subs: "eng".into(), }; let mut indexer_test_results = StatefulTable::default(); indexer_test_results.set_items(vec![indexer_test_result()]); indexer_test_results.sorting(vec![sort_option!(name)]); indexer_test_results.search = Some("something".into()); indexer_test_results.filter = Some("something".into()); let mut movie_details_modal = MovieDetailsModal { movie_details: ScrollableText::with_string("Some information".to_owned()), file_details: "Some file info".to_owned(), audio_details: "Some audio info".to_owned(), video_details: "Some video info".to_owned(), ..MovieDetailsModal::default() }; movie_details_modal .movie_history .set_items(vec![movie_history_item()]); movie_details_modal .movie_cast .set_items(vec![cast_credit()]); movie_details_modal .movie_crew .set_items(vec![crew_credit()]); movie_details_modal .movie_releases .set_items(vec![torrent_release(), usenet_release()]); movie_details_modal .movie_releases .sorting(vec![sort_option!(indexer_id)]); let mut radarr_data = RadarrData { disk_space_vec: vec![diskspace()], version: "1.2.3.4".to_owned(), quality_profile_map: quality_profile_map(), tags_map: tags_map(), updates: updates(), start_time: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), add_movie_search: Some("test".into()), add_movie_modal: Some(add_movie_modal), add_searched_movies: Some(add_movie_search_result_table), edit_movie_modal: Some(edit_movie_modal), edit_collection_modal: Some(edit_collection_modal), edit_indexer_modal: Some(edit_indexer_modal), edit_root_folder: Some("/nfs/movies".into()), indexer_settings: Some(indexer_settings), indexer_test_errors: Some("error".into()), indexer_test_all_results: Some(indexer_test_results), movie_details_modal: Some(movie_details_modal), delete_movie_files: true, ..RadarrData::default() }; radarr_data.root_folders.set_items(vec![root_folder()]); radarr_data.movies.set_items(vec![movie()]); radarr_data.movies.sorting(vec![sort_option!(id)]); radarr_data.movies.search = Some("Something".into()); radarr_data.movies.filter = Some("Something".into()); radarr_data.collections.set_items(vec![collection()]); radarr_data.collections.sorting(vec![sort_option!(id)]); radarr_data.collections.search = Some("Something".into()); radarr_data.collections.filter = Some("Something".into()); radarr_data .collection_movies .set_items(vec![collection_movie()]); radarr_data.downloads.set_items(vec![download_record()]); radarr_data.blocklist.set_items(vec![blocklist_item()]); radarr_data.blocklist.sorting(vec![sort_option!(id)]); radarr_data.history.set_items(vec![radarr_history_item()]); radarr_data.history.sorting(vec![sort_option!(id)]); radarr_data.history.search = Some("Something".into()); radarr_data.history.filter = Some("Something".into()); radarr_data.indexers.set_items(vec![indexer()]); radarr_data.indexers.sorting(vec![sort_option!(id)]); radarr_data.indexers.search = Some("Something".into()); radarr_data.indexers.filter = Some("Something".into()); radarr_data.logs.set_items(vec![log_line().into()]); radarr_data.log_details.set_items(vec![log_line().into()]); radarr_data.tasks.set_items(vec![task()]); radarr_data.queued_events.set_items(vec![queued_event()]); radarr_data } } #[derive(Clone, Copy, PartialEq, Eq, Debug, Default, EnumIter)] #[cfg_attr(test, derive(Display, EnumString))] pub enum ActiveRadarrBlock { AddMovieAlreadyInLibrary, AddMovieSearchInput, AddMovieSearchResults, AddMoviePrompt, AddMovieSelectMinimumAvailability, AddMovieSelectQualityProfile, AddMovieSelectMonitor, AddMovieSelectRootFolder, AddMovieConfirmPrompt, AddMovieTagsInput, AddMovieEmptySearchResults, AddRootFolderPrompt, AutomaticallySearchMoviePrompt, Blocklist, BlocklistClearAllItemsPrompt, BlocklistItemDetails, BlocklistSortPrompt, History, HistoryItemDetails, HistorySortPrompt, FilterHistory, FilterHistoryError, SearchHistory, SearchHistoryError, Collections, CollectionsSortPrompt, CollectionDetails, Cast, Crew, DeleteBlocklistItemPrompt, DeleteDownloadPrompt, DeleteIndexerPrompt, DeleteMoviePrompt, DeleteMovieConfirmPrompt, DeleteMovieToggleDeleteFile, DeleteMovieToggleAddListExclusion, DeleteRootFolderPrompt, Downloads, EditCollectionPrompt, EditCollectionConfirmPrompt, EditCollectionRootFolderPathInput, EditCollectionSelectMinimumAvailability, EditCollectionSelectQualityProfile, EditCollectionToggleSearchOnAdd, EditCollectionToggleMonitored, EditIndexerPrompt, EditIndexerConfirmPrompt, EditIndexerApiKeyInput, EditIndexerNameInput, EditIndexerSeedRatioInput, EditIndexerToggleEnableRss, EditIndexerToggleEnableAutomaticSearch, EditIndexerToggleEnableInteractiveSearch, EditIndexerPriorityInput, EditIndexerUrlInput, EditIndexerTagsInput, EditMoviePrompt, EditMovieConfirmPrompt, EditMoviePathInput, EditMovieSelectMinimumAvailability, EditMovieSelectQualityProfile, EditMovieTagsInput, EditMovieToggleMonitored, FileInfo, FilterCollections, FilterCollectionsError, FilterMovies, FilterMoviesError, Indexers, AllIndexerSettingsPrompt, IndexerSettingsAvailabilityDelayInput, IndexerSettingsConfirmPrompt, IndexerSettingsMaximumSizeInput, IndexerSettingsMinimumAgeInput, IndexerSettingsRetentionInput, IndexerSettingsRssSyncIntervalInput, IndexerSettingsToggleAllowHardcodedSubs, IndexerSettingsTogglePreferIndexerFlags, IndexerSettingsWhitelistedSubtitleTagsInput, ManualSearch, ManualSearchSortPrompt, ManualSearchConfirmPrompt, MovieDetails, MovieHistory, #[default] Movies, MoviesSortPrompt, RootFolders, System, SystemLogs, SystemQueuedEvents, SystemTasks, SystemTaskStartConfirmPrompt, SystemUpdates, TestIndexer, TestAllIndexers, UpdateAndScanPrompt, UpdateAllCollectionsPrompt, UpdateAllMoviesPrompt, UpdateDownloadsPrompt, SearchCollection, SearchCollectionError, SearchMovie, SearchMovieError, ViewMovieOverview, } pub static LIBRARY_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::Movies, ActiveRadarrBlock::MoviesSortPrompt, ActiveRadarrBlock::SearchMovie, ActiveRadarrBlock::SearchMovieError, ActiveRadarrBlock::FilterMovies, ActiveRadarrBlock::FilterMoviesError, ActiveRadarrBlock::UpdateAllMoviesPrompt, ]; pub static COLLECTIONS_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::Collections, ActiveRadarrBlock::CollectionsSortPrompt, ActiveRadarrBlock::SearchCollection, ActiveRadarrBlock::SearchCollectionError, ActiveRadarrBlock::FilterCollections, ActiveRadarrBlock::FilterCollectionsError, ActiveRadarrBlock::UpdateAllCollectionsPrompt, ]; pub static INDEXERS_BLOCKS: [ActiveRadarrBlock; 3] = [ ActiveRadarrBlock::DeleteIndexerPrompt, ActiveRadarrBlock::Indexers, ActiveRadarrBlock::TestIndexer, ]; pub static ROOT_FOLDERS_BLOCKS: [ActiveRadarrBlock; 3] = [ ActiveRadarrBlock::RootFolders, ActiveRadarrBlock::AddRootFolderPrompt, ActiveRadarrBlock::DeleteRootFolderPrompt, ]; pub static BLOCKLIST_BLOCKS: [ActiveRadarrBlock; 5] = [ ActiveRadarrBlock::Blocklist, ActiveRadarrBlock::BlocklistItemDetails, ActiveRadarrBlock::DeleteBlocklistItemPrompt, ActiveRadarrBlock::BlocklistClearAllItemsPrompt, ActiveRadarrBlock::BlocklistSortPrompt, ]; pub static HISTORY_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::History, ActiveRadarrBlock::HistoryItemDetails, ActiveRadarrBlock::HistorySortPrompt, ActiveRadarrBlock::FilterHistory, ActiveRadarrBlock::FilterHistoryError, ActiveRadarrBlock::SearchHistory, ActiveRadarrBlock::SearchHistoryError, ]; pub static ADD_MOVIE_BLOCKS: [ActiveRadarrBlock; 10] = [ ActiveRadarrBlock::AddMovieSearchInput, ActiveRadarrBlock::AddMovieSearchResults, ActiveRadarrBlock::AddMovieEmptySearchResults, ActiveRadarrBlock::AddMoviePrompt, ActiveRadarrBlock::AddMovieSelectMinimumAvailability, ActiveRadarrBlock::AddMovieSelectMonitor, ActiveRadarrBlock::AddMovieSelectQualityProfile, ActiveRadarrBlock::AddMovieSelectRootFolder, ActiveRadarrBlock::AddMovieAlreadyInLibrary, ActiveRadarrBlock::AddMovieTagsInput, ]; pub const ADD_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::AddMovieSelectRootFolder], &[ActiveRadarrBlock::AddMovieSelectMonitor], &[ActiveRadarrBlock::AddMovieSelectMinimumAvailability], &[ActiveRadarrBlock::AddMovieSelectQualityProfile], &[ActiveRadarrBlock::AddMovieTagsInput], &[ActiveRadarrBlock::AddMovieConfirmPrompt], ]; pub static EDIT_COLLECTION_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::EditCollectionPrompt, ActiveRadarrBlock::EditCollectionConfirmPrompt, ActiveRadarrBlock::EditCollectionRootFolderPathInput, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability, ActiveRadarrBlock::EditCollectionSelectQualityProfile, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd, ActiveRadarrBlock::EditCollectionToggleMonitored, ]; pub const EDIT_COLLECTION_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::EditCollectionToggleMonitored], &[ActiveRadarrBlock::EditCollectionSelectMinimumAvailability], &[ActiveRadarrBlock::EditCollectionSelectQualityProfile], &[ActiveRadarrBlock::EditCollectionRootFolderPathInput], &[ActiveRadarrBlock::EditCollectionToggleSearchOnAdd], &[ActiveRadarrBlock::EditCollectionConfirmPrompt], ]; pub static EDIT_MOVIE_BLOCKS: [ActiveRadarrBlock; 7] = [ ActiveRadarrBlock::EditMoviePrompt, ActiveRadarrBlock::EditMovieConfirmPrompt, ActiveRadarrBlock::EditMoviePathInput, ActiveRadarrBlock::EditMovieSelectMinimumAvailability, ActiveRadarrBlock::EditMovieSelectQualityProfile, ActiveRadarrBlock::EditMovieTagsInput, ActiveRadarrBlock::EditMovieToggleMonitored, ]; pub const EDIT_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::EditMovieToggleMonitored], &[ActiveRadarrBlock::EditMovieSelectMinimumAvailability], &[ActiveRadarrBlock::EditMovieSelectQualityProfile], &[ActiveRadarrBlock::EditMoviePathInput], &[ActiveRadarrBlock::EditMovieTagsInput], &[ActiveRadarrBlock::EditMovieConfirmPrompt], ]; pub static DOWNLOADS_BLOCKS: [ActiveRadarrBlock; 3] = [ ActiveRadarrBlock::Downloads, ActiveRadarrBlock::DeleteDownloadPrompt, ActiveRadarrBlock::UpdateDownloadsPrompt, ]; pub static MOVIE_DETAILS_BLOCKS: [ActiveRadarrBlock; 10] = [ ActiveRadarrBlock::MovieDetails, ActiveRadarrBlock::MovieHistory, ActiveRadarrBlock::FileInfo, ActiveRadarrBlock::Cast, ActiveRadarrBlock::Crew, ActiveRadarrBlock::AutomaticallySearchMoviePrompt, ActiveRadarrBlock::UpdateAndScanPrompt, ActiveRadarrBlock::ManualSearch, ActiveRadarrBlock::ManualSearchSortPrompt, ActiveRadarrBlock::ManualSearchConfirmPrompt, ]; pub static COLLECTION_DETAILS_BLOCKS: [ActiveRadarrBlock; 2] = [ ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::ViewMovieOverview, ]; pub static DELETE_MOVIE_BLOCKS: [ActiveRadarrBlock; 4] = [ ActiveRadarrBlock::DeleteMoviePrompt, ActiveRadarrBlock::DeleteMovieConfirmPrompt, ActiveRadarrBlock::DeleteMovieToggleDeleteFile, ActiveRadarrBlock::DeleteMovieToggleAddListExclusion, ]; pub const DELETE_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ActiveRadarrBlock::DeleteMovieToggleDeleteFile], &[ActiveRadarrBlock::DeleteMovieToggleAddListExclusion], &[ActiveRadarrBlock::DeleteMovieConfirmPrompt], ]; pub static EDIT_INDEXER_BLOCKS: [ActiveRadarrBlock; 11] = [ ActiveRadarrBlock::EditIndexerPrompt, ActiveRadarrBlock::EditIndexerConfirmPrompt, ActiveRadarrBlock::EditIndexerApiKeyInput, ActiveRadarrBlock::EditIndexerNameInput, ActiveRadarrBlock::EditIndexerSeedRatioInput, ActiveRadarrBlock::EditIndexerToggleEnableRss, ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch, ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch, ActiveRadarrBlock::EditIndexerPriorityInput, ActiveRadarrBlock::EditIndexerUrlInput, ActiveRadarrBlock::EditIndexerTagsInput, ]; pub const EDIT_INDEXER_TORRENT_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ ActiveRadarrBlock::EditIndexerNameInput, ActiveRadarrBlock::EditIndexerUrlInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableRss, ActiveRadarrBlock::EditIndexerApiKeyInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch, ActiveRadarrBlock::EditIndexerSeedRatioInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch, ActiveRadarrBlock::EditIndexerTagsInput, ], &[ ActiveRadarrBlock::EditIndexerPriorityInput, ActiveRadarrBlock::EditIndexerConfirmPrompt, ], &[ ActiveRadarrBlock::EditIndexerConfirmPrompt, ActiveRadarrBlock::EditIndexerConfirmPrompt, ], ]; pub const EDIT_INDEXER_NZB_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ ActiveRadarrBlock::EditIndexerNameInput, ActiveRadarrBlock::EditIndexerUrlInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableRss, ActiveRadarrBlock::EditIndexerApiKeyInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch, ActiveRadarrBlock::EditIndexerTagsInput, ], &[ ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch, ActiveRadarrBlock::EditIndexerPriorityInput, ], &[ ActiveRadarrBlock::EditIndexerConfirmPrompt, ActiveRadarrBlock::EditIndexerConfirmPrompt, ], ]; pub static INDEXER_SETTINGS_BLOCKS: [ActiveRadarrBlock; 10] = [ ActiveRadarrBlock::AllIndexerSettingsPrompt, ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput, ActiveRadarrBlock::IndexerSettingsConfirmPrompt, ActiveRadarrBlock::IndexerSettingsMaximumSizeInput, ActiveRadarrBlock::IndexerSettingsMinimumAgeInput, ActiveRadarrBlock::IndexerSettingsRetentionInput, ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput, ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs, ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags, ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput, ]; pub const INDEXER_SETTINGS_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[ &[ ActiveRadarrBlock::IndexerSettingsMinimumAgeInput, ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput, ], &[ ActiveRadarrBlock::IndexerSettingsRetentionInput, ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput, ], &[ ActiveRadarrBlock::IndexerSettingsMaximumSizeInput, ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput, ], &[ ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags, ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs, ], &[ ActiveRadarrBlock::IndexerSettingsConfirmPrompt, ActiveRadarrBlock::IndexerSettingsConfirmPrompt, ], ]; pub static SYSTEM_DETAILS_BLOCKS: [ActiveRadarrBlock; 5] = [ ActiveRadarrBlock::SystemLogs, ActiveRadarrBlock::SystemQueuedEvents, ActiveRadarrBlock::SystemTasks, ActiveRadarrBlock::SystemTaskStartConfirmPrompt, ActiveRadarrBlock::SystemUpdates, ]; impl From for Route { fn from(active_radarr_block: ActiveRadarrBlock) -> Route { Route::Radarr(active_radarr_block, None) } } impl From<(ActiveRadarrBlock, Option)> for Route { fn from(value: (ActiveRadarrBlock, Option)) -> Route { Route::Radarr(value.0, value.1) } }