refactor: Let serde serialize Add Series and Add Movie enums instead of calling to_string up front

This commit is contained in:
2026-01-08 10:52:30 -07:00
parent b1a6db21f1
commit e94f78dc7b
13 changed files with 53 additions and 40 deletions
+4 -3
View File
@@ -6,7 +6,8 @@ mod tests {
use crate::app::App; use crate::app::App;
use crate::app::radarr::ActiveRadarrBlock; use crate::app::radarr::ActiveRadarrBlock;
use crate::models::radarr_models::{ 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_data::radarr::modals::MovieDetailsModal;
use crate::models::servarr_models::Indexer; use crate::models::servarr_models::Indexer;
@@ -88,13 +89,13 @@ mod tests {
tmdb_id: 1234, tmdb_id: 1234,
title: "Test".to_owned(), title: "Test".to_owned(),
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
minimum_availability: "announced".to_owned(), minimum_availability: MinimumAvailability::Announced,
monitored: true, monitored: true,
quality_profile_id: 2222, quality_profile_id: 2222,
tags: vec![1, 2], tags: vec![1, 2],
tag_input_string: None, tag_input_string: None,
add_options: AddMovieOptions { add_options: AddMovieOptions {
monitor: "movieOnly".to_owned(), monitor: MovieMonitor::MovieOnly,
search_for_movie: true, search_for_movie: true,
}, },
}; };
+2 -2
View File
@@ -122,12 +122,12 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrAddCommand> for RadarrAddCommandHan
title: String::new(), title: String::new(),
root_folder_path, root_folder_path,
quality_profile_id, quality_profile_id,
minimum_availability: minimum_availability.to_string(), minimum_availability,
monitored: !disable_monitoring, monitored: !disable_monitoring,
tags, tags,
tag_input_string: None, tag_input_string: None,
add_options: AddMovieOptions { add_options: AddMovieOptions {
monitor: monitor.to_string(), monitor,
search_for_movie: !no_search_for_movie, search_for_movie: !no_search_for_movie,
}, },
}; };
+2 -2
View File
@@ -384,12 +384,12 @@ mod tests {
title: String::new(), title: String::new(),
root_folder_path: "/test".to_owned(), root_folder_path: "/test".to_owned(),
quality_profile_id: 1, quality_profile_id: 1,
minimum_availability: "released".to_owned(), minimum_availability: MinimumAvailability::Released,
monitored: false, monitored: false,
tags: vec![1, 2], tags: vec![1, 2],
tag_input_string: None, tag_input_string: None,
add_options: AddMovieOptions { add_options: AddMovieOptions {
monitor: "movieAndCollection".to_owned(), monitor: MovieMonitor::MovieAndCollection,
search_for_movie: false, search_for_movie: false,
}, },
}; };
+2 -2
View File
@@ -137,12 +137,12 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrAddCommand> for SonarrAddCommandHan
root_folder_path, root_folder_path,
quality_profile_id, quality_profile_id,
language_profile_id, language_profile_id,
series_type: series_type.to_string(), series_type,
season_folder: !disable_season_folders, season_folder: !disable_season_folders,
tags, tags,
tag_input_string: None, tag_input_string: None,
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: monitor.to_string(), monitor,
search_for_cutoff_unmet_episodes: !no_search_for_series, search_for_cutoff_unmet_episodes: !no_search_for_series,
search_for_missing_episodes: !no_search_for_series, search_for_missing_episodes: !no_search_for_series,
}, },
+2 -2
View File
@@ -517,13 +517,13 @@ mod tests {
root_folder_path: "/test".to_owned(), root_folder_path: "/test".to_owned(),
quality_profile_id: 1, quality_profile_id: 1,
language_profile_id: 1, language_profile_id: 1,
series_type: "anime".to_owned(), series_type: SeriesType::Anime,
monitored: false, monitored: false,
tags: vec![1, 2], tags: vec![1, 2],
tag_input_string: None, tag_input_string: None,
season_folder: false, season_folder: false,
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: "future".to_owned(), monitor: SeriesMonitor::Future,
search_for_cutoff_unmet_episodes: false, search_for_cutoff_unmet_episodes: false,
search_for_missing_episodes: false, search_for_missing_episodes: false,
}, },
@@ -83,8 +83,8 @@ impl AddMovieHandler<'_, '_> {
.unwrap(); .unwrap();
let path = root_folder_list.current_selection().path.clone(); let path = root_folder_list.current_selection().path.clone();
let monitor = monitor_list.current_selection().to_string(); let monitor = *monitor_list.current_selection();
let minimum_availability = minimum_availability_list.current_selection().to_string(); let minimum_availability = *minimum_availability_list.current_selection();
AddMovieBody { AddMovieBody {
tmdb_id, tmdb_id,
@@ -5,7 +5,7 @@ pub(in crate::handlers::radarr_handlers) mod utils {
use crate::models::radarr_models::{ use crate::models::radarr_models::{
AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie, AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie,
DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection,
MovieFile, RadarrRelease, Rating, RatingsList, MovieFile, MovieMonitor, RadarrRelease, Rating, RatingsList,
}; };
use crate::models::servarr_models::{ use crate::models::servarr_models::{
Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder,
@@ -470,13 +470,13 @@ pub(in crate::handlers::radarr_handlers) mod utils {
tmdb_id: 1234, tmdb_id: 1234,
title: "Test".to_owned(), title: "Test".to_owned(),
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
minimum_availability: "announced".to_owned(), minimum_availability: MinimumAvailability::Announced,
monitored: true, monitored: true,
quality_profile_id: 2222, quality_profile_id: 2222,
tags: Vec::new(), tags: Vec::new(),
tag_input_string: Some("usenet, testing".into()), tag_input_string: Some("usenet, testing".into()),
add_options: AddMovieOptions { add_options: AddMovieOptions {
monitor: "movieOnly".to_owned(), monitor: MovieMonitor::MovieOnly,
search_for_movie: true, search_for_movie: true,
}, },
} }
@@ -74,8 +74,8 @@ impl AddSeriesHandler<'_, '_> {
.unwrap(); .unwrap();
let path = root_folder_list.current_selection().path.clone(); let path = root_folder_list.current_selection().path.clone();
let monitor = monitor_list.current_selection().to_string(); let monitor = *monitor_list.current_selection();
let series_type = series_type_list.current_selection().to_string(); let series_type = *series_type_list.current_selection();
AddSeriesBody { AddSeriesBody {
tvdb_id, tvdb_id,
@@ -1169,12 +1169,12 @@ mod tests {
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
quality_profile_id: 2222, quality_profile_id: 2222,
language_profile_id: 2222, language_profile_id: 2222,
series_type: "standard".to_owned(), series_type: SeriesType::Standard,
season_folder: true, season_folder: true,
tags: Vec::default(), tags: Vec::default(),
tag_input_string: Some("usenet, testing".to_owned()), tag_input_string: Some("usenet, testing".to_owned()),
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: "all".to_owned(), monitor: SeriesMonitor::All,
search_for_cutoff_unmet_episodes: true, search_for_cutoff_unmet_episodes: true,
search_for_missing_episodes: true, search_for_missing_episodes: true,
}, },
@@ -1647,12 +1647,12 @@ mod tests {
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
quality_profile_id: 2222, quality_profile_id: 2222,
language_profile_id: 2222, language_profile_id: 2222,
series_type: "standard".to_owned(), series_type: SeriesType::Standard,
season_folder: true, season_folder: true,
tags: Vec::default(), tags: Vec::default(),
tag_input_string: Some("usenet, testing".to_owned()), tag_input_string: Some("usenet, testing".to_owned()),
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: "all".to_owned(), monitor: SeriesMonitor::All,
search_for_cutoff_unmet_episodes: true, search_for_cutoff_unmet_episodes: true,
search_for_missing_episodes: true, search_for_missing_episodes: true,
}, },
@@ -1777,12 +1777,12 @@ mod tests {
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
quality_profile_id: 2222, quality_profile_id: 2222,
language_profile_id: 2222, language_profile_id: 2222,
series_type: "standard".to_owned(), series_type: SeriesType::Standard,
season_folder: true, season_folder: true,
tags: Vec::default(), tags: Vec::default(),
tag_input_string: Some("usenet, testing".to_owned()), tag_input_string: Some("usenet, testing".to_owned()),
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: "all".to_owned(), monitor: SeriesMonitor::All,
search_for_cutoff_unmet_episodes: true, search_for_cutoff_unmet_episodes: true,
search_for_missing_episodes: true, search_for_missing_episodes: true,
}, },
+15 -3
View File
@@ -27,7 +27,7 @@ pub struct AddMovieBody {
pub title: String, pub title: String,
pub root_folder_path: String, pub root_folder_path: String,
pub quality_profile_id: i64, pub quality_profile_id: i64,
pub minimum_availability: String, pub minimum_availability: MinimumAvailability,
pub monitored: bool, pub monitored: bool,
pub tags: Vec<i64>, pub tags: Vec<i64>,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
@@ -55,7 +55,7 @@ pub struct AddMovieSearchResult {
#[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)] #[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct AddMovieOptions { pub struct AddMovieOptions {
pub monitor: String, pub monitor: MovieMonitor,
pub search_for_movie: bool, pub search_for_movie: bool,
} }
@@ -268,8 +268,20 @@ pub enum MinimumAvailability {
} }
#[derive( #[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")] #[strum(serialize_all = "camelCase")]
pub enum MovieMonitor { pub enum MovieMonitor {
#[default] #[default]
+2 -2
View File
@@ -31,7 +31,7 @@ pub struct AddSeriesBody {
pub root_folder_path: String, pub root_folder_path: String,
pub quality_profile_id: i64, pub quality_profile_id: i64,
pub language_profile_id: i64, pub language_profile_id: i64,
pub series_type: String, pub series_type: SeriesType,
pub season_folder: bool, pub season_folder: bool,
pub tags: Vec<i64>, pub tags: Vec<i64>,
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
@@ -68,7 +68,7 @@ pub struct AddSeriesSearchResultStatistics {
#[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)] #[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct AddSeriesOptions { pub struct AddSeriesOptions {
pub monitor: String, pub monitor: SeriesMonitor,
pub search_for_cutoff_unmet_episodes: bool, pub search_for_cutoff_unmet_episodes: bool,
pub search_for_missing_episodes: bool, pub search_for_missing_episodes: bool,
} }
@@ -2,7 +2,7 @@
mod tests { mod tests {
use crate::models::radarr_models::{ use crate::models::radarr_models::{
AddMovieBody, AddMovieOptions, Credit, DeleteMovieParams, DownloadRecord, EditMovieParams, 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::modals::MovieDetailsModal;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
@@ -50,13 +50,13 @@ mod tests {
tmdb_id: 1234, tmdb_id: 1234,
title: "Test".to_owned(), title: "Test".to_owned(),
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
minimum_availability: "announced".to_owned(), minimum_availability: MinimumAvailability::Announced,
monitored: true, monitored: true,
quality_profile_id: 2222, quality_profile_id: 2222,
tags: vec![1, 2], tags: vec![1, 2],
tag_input_string: Some("usenet, testing".into()), tag_input_string: Some("usenet, testing".into()),
add_options: AddMovieOptions { add_options: AddMovieOptions {
monitor: "movieOnly".to_owned(), monitor: MovieMonitor::MovieOnly,
search_for_movie: true, search_for_movie: true,
}, },
}; };
@@ -99,13 +99,13 @@ mod tests {
tmdb_id: 1234, tmdb_id: 1234,
title: "Test".to_owned(), title: "Test".to_owned(),
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
minimum_availability: "announced".to_owned(), minimum_availability: MinimumAvailability::Announced,
monitored: true, monitored: true,
quality_profile_id: 2222, quality_profile_id: 2222,
tags: vec![1, 2], tags: vec![1, 2],
tag_input_string: None, tag_input_string: None,
add_options: AddMovieOptions { add_options: AddMovieOptions {
monitor: "movieOnly".to_owned(), monitor: MovieMonitor::MovieOnly,
search_for_movie: true, search_for_movie: true,
}, },
}; };
@@ -2,8 +2,8 @@
mod tests { mod tests {
use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
use crate::models::sonarr_models::{ use crate::models::sonarr_models::{
AddSeriesBody, AddSeriesOptions, DeleteSeriesParams, EditSeriesParams, Series, SeriesType, AddSeriesBody, AddSeriesOptions, DeleteSeriesParams, EditSeriesParams, Series, SeriesMonitor,
SonarrHistoryItem, SonarrSerdeable, SeriesType, SonarrHistoryItem, SonarrSerdeable,
}; };
use crate::models::stateful_table::{SortOption, StatefulTable}; use crate::models::stateful_table::{SortOption, StatefulTable};
use crate::network::NetworkResource; use crate::network::NetworkResource;
@@ -27,12 +27,12 @@ mod tests {
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
quality_profile_id: 2222, quality_profile_id: 2222,
language_profile_id: 2222, language_profile_id: 2222,
series_type: "standard".to_owned(), series_type: SeriesType::Standard,
season_folder: true, season_folder: true,
tags: Vec::new(), tags: Vec::new(),
tag_input_string: Some("usenet, testing".to_owned()), tag_input_string: Some("usenet, testing".to_owned()),
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: "all".to_owned(), monitor: SeriesMonitor::All,
search_for_cutoff_unmet_episodes: true, search_for_cutoff_unmet_episodes: true,
search_for_missing_episodes: true, search_for_missing_episodes: true,
}, },
@@ -82,12 +82,12 @@ mod tests {
root_folder_path: "/nfs2".to_owned(), root_folder_path: "/nfs2".to_owned(),
quality_profile_id: 2222, quality_profile_id: 2222,
language_profile_id: 2222, language_profile_id: 2222,
series_type: "standard".to_owned(), series_type: SeriesType::Standard,
season_folder: true, season_folder: true,
tags: vec![1, 2], tags: vec![1, 2],
tag_input_string: None, tag_input_string: None,
add_options: AddSeriesOptions { add_options: AddSeriesOptions {
monitor: "all".to_owned(), monitor: SeriesMonitor::All,
search_for_cutoff_unmet_episodes: true, search_for_cutoff_unmet_episodes: true,
search_for_missing_episodes: true, search_for_missing_episodes: true,
}, },