refactor: Reduced the number of clones necessary when building modal structs

This commit is contained in:
2025-01-18 13:56:18 -07:00
parent 652bbcd5d4
commit fda69178b9
13 changed files with 203 additions and 276 deletions
+2 -3
View File
@@ -187,12 +187,11 @@ impl<'a> App<'a> {
async fn check_for_sonarr_prompt_action(&mut self) { async fn check_for_sonarr_prompt_action(&mut self) {
if self.data.sonarr_data.prompt_confirm { if self.data.sonarr_data.prompt_confirm {
self.data.sonarr_data.prompt_confirm = false; self.data.sonarr_data.prompt_confirm = false;
if let Some(sonarr_event) = &self.data.sonarr_data.prompt_confirm_action { if let Some(sonarr_event) = self.data.sonarr_data.prompt_confirm_action.take() {
self self
.dispatch_network_event(sonarr_event.clone().into()) .dispatch_network_event(sonarr_event.into())
.await; .await;
self.should_refresh = true; self.should_refresh = true;
self.data.sonarr_data.prompt_confirm_action = None;
} }
} }
} }
@@ -22,6 +22,13 @@ pub(super) struct EditCollectionHandler<'a, 'b> {
impl<'a, 'b> EditCollectionHandler<'a, 'b> { impl<'a, 'b> EditCollectionHandler<'a, 'b> {
fn build_edit_collection_params(&mut self) -> EditCollectionParams { fn build_edit_collection_params(&mut self) -> EditCollectionParams {
let edit_collection_modal = self
.app
.data
.radarr_data
.edit_collection_modal
.take()
.expect("EditCollectionModal is None");
let collection_id = self.app.data.radarr_data.collections.current_selection().id; let collection_id = self.app.data.radarr_data.collections.current_selection().id;
let EditCollectionModal { let EditCollectionModal {
path, path,
@@ -29,13 +36,7 @@ impl<'a, 'b> EditCollectionHandler<'a, 'b> {
minimum_availability_list, minimum_availability_list,
monitored, monitored,
quality_profile_list, quality_profile_list,
} = self } = edit_collection_modal;
.app
.data
.radarr_data
.edit_collection_modal
.as_ref()
.unwrap();
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self let quality_profile_id = *self
.app .app
@@ -48,15 +49,13 @@ impl<'a, 'b> EditCollectionHandler<'a, 'b> {
.next() .next()
.unwrap(); .unwrap();
let root_folder_path: String = path.text.clone(); let root_folder_path = path.text;
let monitored = monitored.unwrap_or_default();
let search_on_add = search_on_add.unwrap_or_default(); let search_on_add = search_on_add.unwrap_or_default();
let minimum_availability = *minimum_availability_list.current_selection(); let minimum_availability = *minimum_availability_list.current_selection();
self.app.data.radarr_data.edit_collection_modal = None;
EditCollectionParams { EditCollectionParams {
collection_id, collection_id,
monitored: Some(monitored), monitored,
minimum_availability: Some(minimum_availability), minimum_availability: Some(minimum_availability),
quality_profile_id: Some(quality_profile_id), quality_profile_id: Some(quality_profile_id),
root_folder_path: Some(root_folder_path), root_folder_path: Some(root_folder_path),
@@ -21,19 +21,16 @@ pub(super) struct EditIndexerHandler<'a, 'b> {
impl<'a, 'b> EditIndexerHandler<'a, 'b> { impl<'a, 'b> EditIndexerHandler<'a, 'b> {
fn build_edit_indexer_params(&mut self) -> EditIndexerParams { fn build_edit_indexer_params(&mut self) -> EditIndexerParams {
let indexer_id = self.app.data.radarr_data.indexers.current_selection().id; let edit_indexer_modal = self
let tags = self
.app .app
.data .data
.radarr_data .radarr_data
.edit_indexer_modal .edit_indexer_modal
.as_ref() .take()
.unwrap() .expect("Edit Indexer Modal is None");
.tags let indexer_id = self.app.data.radarr_data.indexers.current_selection().id;
.text let tags = edit_indexer_modal.tags.text;
.clone();
let params = {
let EditIndexerModal { let EditIndexerModal {
name, name,
enable_rss, enable_rss,
@@ -44,33 +41,22 @@ impl<'a, 'b> EditIndexerHandler<'a, 'b> {
seed_ratio, seed_ratio,
priority, priority,
.. ..
} = self } = edit_indexer_modal;
.app
.data
.radarr_data
.edit_indexer_modal
.as_ref()
.unwrap();
EditIndexerParams { EditIndexerParams {
indexer_id, indexer_id,
name: Some(name.text.clone()), name: Some(name.text),
enable_rss: Some(enable_rss.unwrap_or_default()), enable_rss: Some(enable_rss.unwrap_or_default()),
enable_automatic_search: Some(enable_automatic_search.unwrap_or_default()), enable_automatic_search: Some(enable_automatic_search.unwrap_or_default()),
enable_interactive_search: Some(enable_interactive_search.unwrap_or_default()), enable_interactive_search: Some(enable_interactive_search.unwrap_or_default()),
url: Some(url.text.clone()), url: Some(url.text),
api_key: Some(api_key.text.clone()), api_key: Some(api_key.text),
seed_ratio: Some(seed_ratio.text.clone()), seed_ratio: Some(seed_ratio.text),
tags: None, tags: None,
tag_input_string: Some(tags), tag_input_string: Some(tags),
priority: Some(*priority), priority: Some(priority),
clear_tags: false, clear_tags: false,
} }
};
self.app.data.radarr_data.edit_indexer_modal = None;
params
} }
} }
@@ -22,9 +22,13 @@ pub(super) struct IndexerSettingsHandler<'a, 'b> {
impl<'a, 'b> IndexerSettingsHandler<'a, 'b> { impl<'a, 'b> IndexerSettingsHandler<'a, 'b> {
fn build_edit_indexer_settings_body(&mut self) -> IndexerSettings { fn build_edit_indexer_settings_body(&mut self) -> IndexerSettings {
let indexer_settings = self.app.data.radarr_data.indexer_settings.clone().unwrap(); self
self.app.data.radarr_data.indexer_settings = None; .app
indexer_settings .data
.radarr_data
.indexer_settings
.take()
.expect("Indexer settings not found")
} }
} }
@@ -39,23 +39,21 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
); );
fn build_add_movie_body(&mut self) -> AddMovieBody { fn build_add_movie_body(&mut self) -> AddMovieBody {
let tags = self let add_movie_modal = self
.app .app
.data .data
.radarr_data .radarr_data
.add_movie_modal .add_movie_modal
.as_ref() .take()
.unwrap() .expect("AddMovieModal is None");
.tags let tags = add_movie_modal.tags.text;
.text
.clone();
let AddMovieModal { let AddMovieModal {
root_folder_list, root_folder_list,
monitor_list, monitor_list,
minimum_availability_list, minimum_availability_list,
quality_profile_list, quality_profile_list,
.. ..
} = self.app.data.radarr_data.add_movie_modal.as_ref().unwrap(); } = add_movie_modal;
let (tmdb_id, title) = if let Some(context) = self.context { let (tmdb_id, title) = if let Some(context) = self.context {
if context == ActiveRadarrBlock::CollectionDetails { if context == ActiveRadarrBlock::CollectionDetails {
let CollectionMovie { tmdb_id, title, .. } = self let CollectionMovie { tmdb_id, title, .. } = self
@@ -63,9 +61,8 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
.data .data
.radarr_data .radarr_data
.collection_movies .collection_movies
.current_selection() .current_selection();
.clone(); (*tmdb_id, title.clone().text)
(tmdb_id, title.text)
} else { } else {
let AddMovieSearchResult { tmdb_id, title, .. } = self let AddMovieSearchResult { tmdb_id, title, .. } = self
.app .app
@@ -74,9 +71,8 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
.add_searched_movies .add_searched_movies
.as_ref() .as_ref()
.unwrap() .unwrap()
.current_selection() .current_selection();
.clone(); (*tmdb_id, title.clone().text)
(tmdb_id, title.text)
} }
} else { } else {
let AddMovieSearchResult { tmdb_id, title, .. } = self let AddMovieSearchResult { tmdb_id, title, .. } = self
@@ -86,9 +82,8 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
.add_searched_movies .add_searched_movies
.as_ref() .as_ref()
.unwrap() .unwrap()
.current_selection() .current_selection();
.clone(); (*tmdb_id, title.clone().text)
(tmdb_id, title.text)
}; };
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self let quality_profile_id = *self
@@ -106,8 +101,6 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
let monitor = monitor_list.current_selection().to_string(); let monitor = monitor_list.current_selection().to_string();
let minimum_availability = minimum_availability_list.current_selection().to_string(); let minimum_availability = minimum_availability_list.current_selection().to_string();
self.app.data.radarr_data.add_movie_modal = None;
AddMovieBody { AddMovieBody {
tmdb_id, tmdb_id,
title, title,
@@ -23,24 +23,21 @@ pub(super) struct EditMovieHandler<'a, 'b> {
impl<'a, 'b> EditMovieHandler<'a, 'b> { impl<'a, 'b> EditMovieHandler<'a, 'b> {
fn build_edit_movie_params(&mut self) -> EditMovieParams { fn build_edit_movie_params(&mut self) -> EditMovieParams {
let movie_id = self.app.data.radarr_data.movies.current_selection().id; let movie_id = self.app.data.radarr_data.movies.current_selection().id;
let tags = self let edit_movie_modal = self
.app .app
.data .data
.radarr_data .radarr_data
.edit_movie_modal .edit_movie_modal
.as_ref() .take()
.unwrap() .expect("Edit movie modal is None");
.tags let tags = edit_movie_modal.tags.text;
.text
.clone();
let params = {
let EditMovieModal { let EditMovieModal {
monitored, monitored,
path, path,
minimum_availability_list, minimum_availability_list,
quality_profile_list, quality_profile_list,
.. ..
} = self.app.data.radarr_data.edit_movie_modal.as_ref().unwrap(); } = edit_movie_modal;
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self let quality_profile_id = *self
.app .app
@@ -55,19 +52,14 @@ impl<'a, 'b> EditMovieHandler<'a, 'b> {
EditMovieParams { EditMovieParams {
movie_id, movie_id,
monitored: *monitored, monitored,
minimum_availability: Some(*minimum_availability_list.current_selection()), minimum_availability: Some(*minimum_availability_list.current_selection()),
quality_profile_id: Some(quality_profile_id), quality_profile_id: Some(quality_profile_id),
root_folder_path: Some(path.text.clone()), root_folder_path: Some(path.text),
tags: None, tags: None,
tag_input_string: Some(tags), tag_input_string: Some(tags),
clear_tags: false, clear_tags: false,
} }
};
self.app.data.radarr_data.edit_movie_modal = None;
params
} }
} }
@@ -30,19 +30,17 @@ impl<'a, 'b> RootFoldersHandler<'a, 'b> {
); );
fn build_add_root_folder_body(&mut self) -> AddRootFolderBody { fn build_add_root_folder_body(&mut self) -> AddRootFolderBody {
let path = self let edit_root_folder = self
.app .app
.data .data
.radarr_data .radarr_data
.edit_root_folder .edit_root_folder
.as_ref() .take()
.unwrap() .expect("AddRootFolder is None");
.text
.clone();
self.app.data.radarr_data.edit_root_folder = None; AddRootFolderBody {
path: edit_root_folder.text,
AddRootFolderBody { path } }
} }
fn extract_root_folder_id(&mut self) -> i64 { fn extract_root_folder_id(&mut self) -> i64 {
@@ -21,18 +21,15 @@ pub(super) struct EditIndexerHandler<'a, 'b> {
impl<'a, 'b> EditIndexerHandler<'a, 'b> { impl<'a, 'b> EditIndexerHandler<'a, 'b> {
fn build_edit_indexer_params(&mut self) -> EditIndexerParams { fn build_edit_indexer_params(&mut self) -> EditIndexerParams {
let indexer_id = self.app.data.sonarr_data.indexers.current_selection().id; let edit_indexer_modal = self
let tags = self
.app .app
.data .data
.sonarr_data .sonarr_data
.edit_indexer_modal .edit_indexer_modal
.as_ref() .take()
.unwrap() .expect("EditIndexerModal is None");
.tags let indexer_id = self.app.data.sonarr_data.indexers.current_selection().id;
.text let tags = edit_indexer_modal.tags.text;
.clone();
let params = {
let EditIndexerModal { let EditIndexerModal {
name, name,
enable_rss, enable_rss,
@@ -43,33 +40,22 @@ impl<'a, 'b> EditIndexerHandler<'a, 'b> {
seed_ratio, seed_ratio,
priority, priority,
.. ..
} = self } = edit_indexer_modal;
.app
.data
.sonarr_data
.edit_indexer_modal
.as_ref()
.unwrap();
EditIndexerParams { EditIndexerParams {
indexer_id, indexer_id,
name: Some(name.text.clone()), name: Some(name.text),
enable_rss: Some(enable_rss.unwrap_or_default()), enable_rss,
enable_automatic_search: Some(enable_automatic_search.unwrap_or_default()), enable_automatic_search,
enable_interactive_search: Some(enable_interactive_search.unwrap_or_default()), enable_interactive_search,
url: Some(url.text.clone()), url: Some(url.text),
api_key: Some(api_key.text.clone()), api_key: Some(api_key.text),
seed_ratio: Some(seed_ratio.text.clone()), seed_ratio: Some(seed_ratio.text),
tags: None, tags: None,
tag_input_string: Some(tags), tag_input_string: Some(tags),
priority: Some(*priority), priority: Some(priority),
clear_tags: false, clear_tags: false,
} }
};
self.app.data.sonarr_data.edit_indexer_modal = None;
params
} }
} }
@@ -22,18 +22,13 @@ pub(super) struct IndexerSettingsHandler<'a, 'b> {
impl<'a, 'b> IndexerSettingsHandler<'a, 'b> { impl<'a, 'b> IndexerSettingsHandler<'a, 'b> {
fn build_edit_indexer_settings_params(&mut self) -> IndexerSettings { fn build_edit_indexer_settings_params(&mut self) -> IndexerSettings {
let indexer_settings = self self
.app .app
.data .data
.sonarr_data .sonarr_data
.indexer_settings .indexer_settings
.as_ref() .take()
.unwrap() .expect("IndexerSettings is None")
.clone();
self.app.data.sonarr_data.indexer_settings = None;
indexer_settings
} }
} }
@@ -37,16 +37,14 @@ impl<'a, 'b> AddSeriesHandler<'a, 'b> {
); );
fn build_add_series_body(&mut self) -> AddSeriesBody { fn build_add_series_body(&mut self) -> AddSeriesBody {
let tags = self let add_series_modal = self
.app .app
.data .data
.sonarr_data .sonarr_data
.add_series_modal .add_series_modal
.as_ref() .take()
.unwrap() .expect("AddSeriesModal is None");
.tags let tags = add_series_modal.tags.text;
.text
.clone();
let AddSeriesModal { let AddSeriesModal {
root_folder_list, root_folder_list,
monitor_list, monitor_list,
@@ -55,8 +53,7 @@ impl<'a, 'b> AddSeriesHandler<'a, 'b> {
series_type_list, series_type_list,
use_season_folder, use_season_folder,
.. ..
} = self.app.data.sonarr_data.add_series_modal.as_ref().unwrap(); } = add_series_modal;
let season_folder = *use_season_folder;
let (tvdb_id, title) = { let (tvdb_id, title) = {
let AddSeriesSearchResult { tvdb_id, title, .. } = self let AddSeriesSearchResult { tvdb_id, title, .. } = self
.app .app
@@ -65,9 +62,8 @@ impl<'a, 'b> AddSeriesHandler<'a, 'b> {
.add_searched_series .add_searched_series
.as_ref() .as_ref()
.unwrap() .unwrap()
.current_selection() .current_selection();
.clone(); (*tvdb_id, title.clone().text)
(tvdb_id, title.text)
}; };
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self let quality_profile_id = *self
@@ -96,8 +92,6 @@ impl<'a, 'b> AddSeriesHandler<'a, 'b> {
let monitor = monitor_list.current_selection().to_string(); let monitor = monitor_list.current_selection().to_string();
let series_type = series_type_list.current_selection().to_string(); let series_type = series_type_list.current_selection().to_string();
self.app.data.sonarr_data.add_series_modal = None;
AddSeriesBody { AddSeriesBody {
tvdb_id, tvdb_id,
title, title,
@@ -106,7 +100,7 @@ impl<'a, 'b> AddSeriesHandler<'a, 'b> {
quality_profile_id, quality_profile_id,
language_profile_id, language_profile_id,
series_type, series_type,
season_folder, season_folder: use_season_folder,
tags: Vec::new(), tags: Vec::new(),
tag_input_string: Some(tags), tag_input_string: Some(tags),
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
@@ -22,19 +22,16 @@ pub(super) struct EditSeriesHandler<'a, 'b> {
impl<'a, 'b> EditSeriesHandler<'a, 'b> { impl<'a, 'b> EditSeriesHandler<'a, 'b> {
fn build_edit_series_params(&mut self) -> EditSeriesParams { fn build_edit_series_params(&mut self) -> EditSeriesParams {
let series_id = self.app.data.sonarr_data.series.current_selection().id; let edit_series_modal = self
let tags = self
.app .app
.data .data
.sonarr_data .sonarr_data
.edit_series_modal .edit_series_modal
.as_ref() .take()
.unwrap() .expect("EditSeriesModal is None");
.tags let series_id = self.app.data.sonarr_data.series.current_selection().id;
.text let tags = edit_series_modal.tags.text;
.clone();
let params = {
let EditSeriesModal { let EditSeriesModal {
monitored, monitored,
use_season_folders, use_season_folders,
@@ -43,13 +40,7 @@ impl<'a, 'b> EditSeriesHandler<'a, 'b> {
quality_profile_list, quality_profile_list,
language_profile_list, language_profile_list,
.. ..
} = self } = edit_series_modal;
.app
.data
.sonarr_data
.edit_series_modal
.as_ref()
.unwrap();
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self let quality_profile_id = *self
.app .app
@@ -75,20 +66,15 @@ impl<'a, 'b> EditSeriesHandler<'a, 'b> {
EditSeriesParams { EditSeriesParams {
series_id, series_id,
monitored: Some(monitored.unwrap_or_default()), monitored,
use_season_folders: Some(use_season_folders.unwrap_or_default()), use_season_folders,
series_type: Some(*series_type_list.current_selection()), series_type: Some(*series_type_list.current_selection()),
quality_profile_id: Some(quality_profile_id), quality_profile_id: Some(quality_profile_id),
language_profile_id: Some(language_profile_id), language_profile_id: Some(language_profile_id),
root_folder_path: Some(path.text.clone()), root_folder_path: Some(path.text),
tag_input_string: Some(tags), tag_input_string: Some(tags),
..EditSeriesParams::default() ..EditSeriesParams::default()
} }
};
self.app.data.sonarr_data.edit_series_modal = None;
params
} }
} }
@@ -35,11 +35,9 @@ impl<'a, 'b> RootFoldersHandler<'a, 'b> {
.data .data
.sonarr_data .sonarr_data
.edit_root_folder .edit_root_folder
.as_ref() .take()
.unwrap() .expect("EditRootFolder is None")
.text .text;
.clone();
self.app.data.sonarr_data.edit_root_folder = None;
AddRootFolderBody { path: root_folder } AddRootFolderBody { path: root_folder }
} }
+8 -11
View File
@@ -235,9 +235,9 @@ where
} }
pub fn apply_filter(&mut self, filter_field: fn(&T) -> &str) -> bool { pub fn apply_filter(&mut self, filter_field: fn(&T) -> &str) -> bool {
let filter_matches = match self.filter { let filter_matches = match self.filter.take() {
Some(ref filter) if !filter.text.is_empty() => { Some(filter) if !filter.text.is_empty() => {
let scrubbed_filter = strip_non_search_characters(&filter.text.clone()); let scrubbed_filter = strip_non_search_characters(&filter.text);
self self
.items .items
@@ -249,8 +249,6 @@ where
_ => Vec::new(), _ => Vec::new(),
}; };
self.filter = None;
if filter_matches.is_empty() { if filter_matches.is_empty() {
return false; return false;
} }
@@ -266,8 +264,9 @@ where
} }
pub fn apply_search(&mut self, search_field: fn(&T) -> &str) -> bool { pub fn apply_search(&mut self, search_field: fn(&T) -> &str) -> bool {
let search_index = if let Some(search) = self.search.as_ref() { let search_index = match self.search.take() {
let search_string = search.text.clone().to_lowercase(); Some(search) => {
let search_string = search.text.to_lowercase();
self self
.filtered_items .filtered_items
@@ -275,12 +274,10 @@ where
.unwrap_or(&self.items) .unwrap_or(&self.items)
.iter() .iter()
.position(|item| strip_non_search_characters(search_field(item)).contains(&search_string)) .position(|item| strip_non_search_characters(search_field(item)).contains(&search_string))
} else { }
None _ => None,
}; };
self.search = None;
if search_index.is_none() { if search_index.is_none() {
return false; return false;
} }