From e94f78dc7b12fcc7ff1fea5200f5bf478eb6d5ec Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 8 Jan 2026 10:52:30 -0700 Subject: [PATCH] refactor: Let serde serialize Add Series and Add Movie enums instead of calling to_string up front --- src/app/radarr/radarr_tests.rs | 7 ++++--- src/cli/radarr/add_command_handler.rs | 4 ++-- src/cli/radarr/add_command_handler_tests.rs | 4 ++-- src/cli/sonarr/add_command_handler.rs | 4 ++-- src/cli/sonarr/add_command_handler_tests.rs | 4 ++-- .../library/add_movie_handler.rs | 4 ++-- .../radarr_handler_test_utils.rs | 6 +++--- .../library/add_series_handler.rs | 4 ++-- .../library/add_series_handler_tests.rs | 12 ++++++------ src/models/radarr_models.rs | 18 +++++++++++++++--- src/models/sonarr_models.rs | 4 ++-- .../library/radarr_library_network_tests.rs | 10 +++++----- .../series/sonarr_series_network_tests.rs | 12 ++++++------ 13 files changed, 53 insertions(+), 40 deletions(-) diff --git a/src/app/radarr/radarr_tests.rs b/src/app/radarr/radarr_tests.rs index e4d1f9b..0783f76 100644 --- a/src/app/radarr/radarr_tests.rs +++ b/src/app/radarr/radarr_tests.rs @@ -6,7 +6,8 @@ mod tests { use crate::app::App; use crate::app::radarr::ActiveRadarrBlock; use crate::models::radarr_models::{ - AddMovieBody, AddMovieOptions, Collection, CollectionMovie, Credit, Movie, RadarrRelease, + AddMovieBody, AddMovieOptions, Collection, CollectionMovie, Credit, MinimumAvailability, Movie, + MovieMonitor, RadarrRelease, }; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_models::Indexer; @@ -88,13 +89,13 @@ mod tests { tmdb_id: 1234, title: "Test".to_owned(), root_folder_path: "/nfs2".to_owned(), - minimum_availability: "announced".to_owned(), + minimum_availability: MinimumAvailability::Announced, monitored: true, quality_profile_id: 2222, tags: vec![1, 2], tag_input_string: None, add_options: AddMovieOptions { - monitor: "movieOnly".to_owned(), + monitor: MovieMonitor::MovieOnly, search_for_movie: true, }, }; diff --git a/src/cli/radarr/add_command_handler.rs b/src/cli/radarr/add_command_handler.rs index f0e73bf..e30bad3 100644 --- a/src/cli/radarr/add_command_handler.rs +++ b/src/cli/radarr/add_command_handler.rs @@ -122,12 +122,12 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrAddCommand> for RadarrAddCommandHan title: String::new(), root_folder_path, quality_profile_id, - minimum_availability: minimum_availability.to_string(), + minimum_availability, monitored: !disable_monitoring, tags, tag_input_string: None, add_options: AddMovieOptions { - monitor: monitor.to_string(), + monitor, search_for_movie: !no_search_for_movie, }, }; diff --git a/src/cli/radarr/add_command_handler_tests.rs b/src/cli/radarr/add_command_handler_tests.rs index bf18652..70eb223 100644 --- a/src/cli/radarr/add_command_handler_tests.rs +++ b/src/cli/radarr/add_command_handler_tests.rs @@ -384,12 +384,12 @@ mod tests { title: String::new(), root_folder_path: "/test".to_owned(), quality_profile_id: 1, - minimum_availability: "released".to_owned(), + minimum_availability: MinimumAvailability::Released, monitored: false, tags: vec![1, 2], tag_input_string: None, add_options: AddMovieOptions { - monitor: "movieAndCollection".to_owned(), + monitor: MovieMonitor::MovieAndCollection, search_for_movie: false, }, }; diff --git a/src/cli/sonarr/add_command_handler.rs b/src/cli/sonarr/add_command_handler.rs index 14117e9..21ffc32 100644 --- a/src/cli/sonarr/add_command_handler.rs +++ b/src/cli/sonarr/add_command_handler.rs @@ -137,12 +137,12 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrAddCommand> for SonarrAddCommandHan root_folder_path, quality_profile_id, language_profile_id, - series_type: series_type.to_string(), + series_type, season_folder: !disable_season_folders, tags, tag_input_string: None, add_options: AddSeriesOptions { - monitor: monitor.to_string(), + monitor, search_for_cutoff_unmet_episodes: !no_search_for_series, search_for_missing_episodes: !no_search_for_series, }, diff --git a/src/cli/sonarr/add_command_handler_tests.rs b/src/cli/sonarr/add_command_handler_tests.rs index 6558ea7..1f5b54d 100644 --- a/src/cli/sonarr/add_command_handler_tests.rs +++ b/src/cli/sonarr/add_command_handler_tests.rs @@ -517,13 +517,13 @@ mod tests { root_folder_path: "/test".to_owned(), quality_profile_id: 1, language_profile_id: 1, - series_type: "anime".to_owned(), + series_type: SeriesType::Anime, monitored: false, tags: vec![1, 2], tag_input_string: None, season_folder: false, add_options: AddSeriesOptions { - monitor: "future".to_owned(), + monitor: SeriesMonitor::Future, search_for_cutoff_unmet_episodes: false, search_for_missing_episodes: false, }, diff --git a/src/handlers/radarr_handlers/library/add_movie_handler.rs b/src/handlers/radarr_handlers/library/add_movie_handler.rs index 555b93c..28609a7 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler.rs @@ -83,8 +83,8 @@ impl AddMovieHandler<'_, '_> { .unwrap(); let path = root_folder_list.current_selection().path.clone(); - let monitor = monitor_list.current_selection().to_string(); - let minimum_availability = minimum_availability_list.current_selection().to_string(); + let monitor = *monitor_list.current_selection(); + let minimum_availability = *minimum_availability_list.current_selection(); AddMovieBody { tmdb_id, diff --git a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs index b97b31e..cc54e07 100644 --- a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs +++ b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs @@ -5,7 +5,7 @@ pub(in crate::handlers::radarr_handlers) mod utils { use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie, DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, - MovieFile, RadarrRelease, Rating, RatingsList, + MovieFile, MovieMonitor, RadarrRelease, Rating, RatingsList, }; use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, @@ -470,13 +470,13 @@ pub(in crate::handlers::radarr_handlers) mod utils { tmdb_id: 1234, title: "Test".to_owned(), root_folder_path: "/nfs2".to_owned(), - minimum_availability: "announced".to_owned(), + minimum_availability: MinimumAvailability::Announced, monitored: true, quality_profile_id: 2222, tags: Vec::new(), tag_input_string: Some("usenet, testing".into()), add_options: AddMovieOptions { - monitor: "movieOnly".to_owned(), + monitor: MovieMonitor::MovieOnly, search_for_movie: true, }, } diff --git a/src/handlers/sonarr_handlers/library/add_series_handler.rs b/src/handlers/sonarr_handlers/library/add_series_handler.rs index 80d8b81..628c453 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler.rs @@ -74,8 +74,8 @@ impl AddSeriesHandler<'_, '_> { .unwrap(); let path = root_folder_list.current_selection().path.clone(); - let monitor = monitor_list.current_selection().to_string(); - let series_type = series_type_list.current_selection().to_string(); + let monitor = *monitor_list.current_selection(); + let series_type = *series_type_list.current_selection(); AddSeriesBody { tvdb_id, diff --git a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs index e7a783a..1003a5a 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs @@ -1169,12 +1169,12 @@ mod tests { root_folder_path: "/nfs2".to_owned(), quality_profile_id: 2222, language_profile_id: 2222, - series_type: "standard".to_owned(), + series_type: SeriesType::Standard, season_folder: true, tags: Vec::default(), tag_input_string: Some("usenet, testing".to_owned()), add_options: AddSeriesOptions { - monitor: "all".to_owned(), + monitor: SeriesMonitor::All, search_for_cutoff_unmet_episodes: true, search_for_missing_episodes: true, }, @@ -1647,12 +1647,12 @@ mod tests { root_folder_path: "/nfs2".to_owned(), quality_profile_id: 2222, language_profile_id: 2222, - series_type: "standard".to_owned(), + series_type: SeriesType::Standard, season_folder: true, tags: Vec::default(), tag_input_string: Some("usenet, testing".to_owned()), add_options: AddSeriesOptions { - monitor: "all".to_owned(), + monitor: SeriesMonitor::All, search_for_cutoff_unmet_episodes: true, search_for_missing_episodes: true, }, @@ -1777,12 +1777,12 @@ mod tests { root_folder_path: "/nfs2".to_owned(), quality_profile_id: 2222, language_profile_id: 2222, - series_type: "standard".to_owned(), + series_type: SeriesType::Standard, season_folder: true, tags: Vec::default(), tag_input_string: Some("usenet, testing".to_owned()), add_options: AddSeriesOptions { - monitor: "all".to_owned(), + monitor: SeriesMonitor::All, search_for_cutoff_unmet_episodes: true, search_for_missing_episodes: true, }, diff --git a/src/models/radarr_models.rs b/src/models/radarr_models.rs index 70b9bdd..826d513 100644 --- a/src/models/radarr_models.rs +++ b/src/models/radarr_models.rs @@ -27,7 +27,7 @@ pub struct AddMovieBody { pub title: String, pub root_folder_path: String, pub quality_profile_id: i64, - pub minimum_availability: String, + pub minimum_availability: MinimumAvailability, pub monitored: bool, pub tags: Vec, #[serde(skip_serializing, skip_deserializing)] @@ -55,7 +55,7 @@ pub struct AddMovieSearchResult { #[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct AddMovieOptions { - pub monitor: String, + pub monitor: MovieMonitor, pub search_for_movie: bool, } @@ -268,8 +268,20 @@ pub enum MinimumAvailability { } #[derive( - Default, PartialEq, Eq, Clone, Copy, Debug, EnumIter, ValueEnum, Display, EnumDisplayStyle, + Serialize, + Deserialize, + Default, + PartialEq, + Eq, + Clone, + Copy, + Debug, + EnumIter, + ValueEnum, + Display, + EnumDisplayStyle, )] +#[serde(rename_all = "camelCase")] #[strum(serialize_all = "camelCase")] pub enum MovieMonitor { #[default] diff --git a/src/models/sonarr_models.rs b/src/models/sonarr_models.rs index 3dda720..115cf35 100644 --- a/src/models/sonarr_models.rs +++ b/src/models/sonarr_models.rs @@ -31,7 +31,7 @@ pub struct AddSeriesBody { pub root_folder_path: String, pub quality_profile_id: i64, pub language_profile_id: i64, - pub series_type: String, + pub series_type: SeriesType, pub season_folder: bool, pub tags: Vec, #[serde(skip_serializing, skip_deserializing)] @@ -68,7 +68,7 @@ pub struct AddSeriesSearchResultStatistics { #[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct AddSeriesOptions { - pub monitor: String, + pub monitor: SeriesMonitor, pub search_for_cutoff_unmet_episodes: bool, pub search_for_missing_episodes: bool, } diff --git a/src/network/radarr_network/library/radarr_library_network_tests.rs b/src/network/radarr_network/library/radarr_library_network_tests.rs index bfcc1af..26215e4 100644 --- a/src/network/radarr_network/library/radarr_library_network_tests.rs +++ b/src/network/radarr_network/library/radarr_library_network_tests.rs @@ -2,7 +2,7 @@ mod tests { use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, Credit, DeleteMovieParams, DownloadRecord, EditMovieParams, - MinimumAvailability, Movie, MovieHistoryItem, RadarrReleaseDownloadBody, + MinimumAvailability, Movie, MovieHistoryItem, MovieMonitor, RadarrReleaseDownloadBody, }; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; @@ -50,13 +50,13 @@ mod tests { tmdb_id: 1234, title: "Test".to_owned(), root_folder_path: "/nfs2".to_owned(), - minimum_availability: "announced".to_owned(), + minimum_availability: MinimumAvailability::Announced, monitored: true, quality_profile_id: 2222, tags: vec![1, 2], tag_input_string: Some("usenet, testing".into()), add_options: AddMovieOptions { - monitor: "movieOnly".to_owned(), + monitor: MovieMonitor::MovieOnly, search_for_movie: true, }, }; @@ -99,13 +99,13 @@ mod tests { tmdb_id: 1234, title: "Test".to_owned(), root_folder_path: "/nfs2".to_owned(), - minimum_availability: "announced".to_owned(), + minimum_availability: MinimumAvailability::Announced, monitored: true, quality_profile_id: 2222, tags: vec![1, 2], tag_input_string: None, add_options: AddMovieOptions { - monitor: "movieOnly".to_owned(), + monitor: MovieMonitor::MovieOnly, search_for_movie: true, }, }; diff --git a/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs b/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs index 26fd6ea..6793431 100644 --- a/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs +++ b/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs @@ -2,8 +2,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::sonarr_models::{ - AddSeriesBody, AddSeriesOptions, DeleteSeriesParams, EditSeriesParams, Series, SeriesType, - SonarrHistoryItem, SonarrSerdeable, + AddSeriesBody, AddSeriesOptions, DeleteSeriesParams, EditSeriesParams, Series, SeriesMonitor, + SeriesType, SonarrHistoryItem, SonarrSerdeable, }; use crate::models::stateful_table::{SortOption, StatefulTable}; use crate::network::NetworkResource; @@ -27,12 +27,12 @@ mod tests { root_folder_path: "/nfs2".to_owned(), quality_profile_id: 2222, language_profile_id: 2222, - series_type: "standard".to_owned(), + series_type: SeriesType::Standard, season_folder: true, tags: Vec::new(), tag_input_string: Some("usenet, testing".to_owned()), add_options: AddSeriesOptions { - monitor: "all".to_owned(), + monitor: SeriesMonitor::All, search_for_cutoff_unmet_episodes: true, search_for_missing_episodes: true, }, @@ -82,12 +82,12 @@ mod tests { root_folder_path: "/nfs2".to_owned(), quality_profile_id: 2222, language_profile_id: 2222, - series_type: "standard".to_owned(), + series_type: SeriesType::Standard, season_folder: true, tags: vec![1, 2], tag_input_string: None, add_options: AddSeriesOptions { - monitor: "all".to_owned(), + monitor: SeriesMonitor::All, search_for_cutoff_unmet_episodes: true, search_for_missing_episodes: true, },