From 7381eaef570bd545a22e82262cd71cfbf83ce813 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 5 Mar 2025 15:09:51 -0700 Subject: [PATCH] refactor: Expanded the serde_enum_from macro to further reduce code duplication --- src/models/mod.rs | 15 +++++++++++++ src/models/radarr_models.rs | 39 +--------------------------------- src/models/sonarr_models.rs | 42 +------------------------------------ 3 files changed, 17 insertions(+), 79 deletions(-) diff --git a/src/models/mod.rs b/src/models/mod.rs index 6e6ceb8..6635e5a 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -445,6 +445,21 @@ pub fn strip_non_search_characters(input: &str) -> String { #[macro_export] macro_rules! serde_enum_from { ($enum_name:ident { $($variant:ident($ty:ty),)* }) => { + #[derive(Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug)] + #[serde(untagged)] + #[allow(clippy::large_enum_variant)] + pub enum $enum_name { + $( + $variant($ty), + )* + } + + impl From<()> for $enum_name { + fn from(_: ()) -> Self { + $enum_name::Value(serde_json::json!({})) + } + } + $( impl From<$ty> for $enum_name { fn from(value: $ty) -> Self { diff --git a/src/models/radarr_models.rs b/src/models/radarr_models.rs index 0ab50cb..8e8b235 100644 --- a/src/models/radarr_models.rs +++ b/src/models/radarr_models.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Utc}; use clap::ValueEnum; use derivative::Derivative; use serde::{Deserialize, Serialize}; -use serde_json::{json, Number, Value}; +use serde_json::{Number, Value}; use strum_macros::EnumIter; use crate::{models::HorizontallyScrollableText, serde_enum_from}; @@ -475,49 +475,12 @@ impl Display for RadarrTaskName { } } -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(untagged)] -#[allow(clippy::large_enum_variant)] -pub enum RadarrSerdeable { - Value(Value), - Tag(Tag), - BlocklistResponse(BlocklistResponse), - Collections(Vec), - Credits(Vec), - DiskSpaces(Vec), - DownloadsResponse(DownloadsResponse), - HostConfig(HostConfig), - Indexers(Vec), - IndexerSettings(IndexerSettings), - LogResponse(LogResponse), - Movie(Movie), - MovieHistoryItems(Vec), - Movies(Vec), - QualityProfiles(Vec), - QueueEvents(Vec), - Releases(Vec), - RootFolders(Vec), - SecurityConfig(SecurityConfig), - SystemStatus(SystemStatus), - Tags(Vec), - Tasks(Vec), - Updates(Vec), - AddMovieSearchResults(Vec), - IndexerTestResults(Vec), -} - impl From for Serdeable { fn from(value: RadarrSerdeable) -> Serdeable { Serdeable::Radarr(value) } } -impl From<()> for RadarrSerdeable { - fn from(_: ()) -> Self { - RadarrSerdeable::Value(json!({})) - } -} - serde_enum_from!( RadarrSerdeable { Value(Value), diff --git a/src/models/sonarr_models.rs b/src/models/sonarr_models.rs index 4033ef5..c41b301 100644 --- a/src/models/sonarr_models.rs +++ b/src/models/sonarr_models.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Utc}; use clap::ValueEnum; use derivative::Derivative; use serde::{Deserialize, Serialize}; -use serde_json::{json, Number, Value}; +use serde_json::{Number, Value}; use strum::EnumIter; use crate::serde_enum_from; @@ -681,52 +681,12 @@ impl Display for SonarrTaskName { } } -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] -#[serde(untagged)] -#[allow(clippy::large_enum_variant)] -pub enum SonarrSerdeable { - AddSeriesSearchResults(Vec), - BlocklistResponse(BlocklistResponse), - DownloadsResponse(DownloadsResponse), - DiskSpaces(Vec), - Episode(Episode), - Episodes(Vec), - EpisodeFiles(Vec), - HostConfig(HostConfig), - IndexerSettings(IndexerSettings), - Indexers(Vec), - IndexerTestResults(Vec), - LanguageProfiles(Vec), - LogResponse(LogResponse), - QualityProfiles(Vec), - QueueEvents(Vec), - Releases(Vec), - RootFolders(Vec), - SecurityConfig(SecurityConfig), - SeriesVec(Vec), - Series(Series), - SonarrHistoryItems(Vec), - SonarrHistoryWrapper(SonarrHistoryWrapper), - SystemStatus(SystemStatus), - Tag(Tag), - Tags(Vec), - Tasks(Vec), - Updates(Vec), - Value(Value), -} - impl From for Serdeable { fn from(value: SonarrSerdeable) -> Serdeable { Serdeable::Sonarr(value) } } -impl From<()> for SonarrSerdeable { - fn from(_: ()) -> Self { - SonarrSerdeable::Value(json!({})) - } -} - serde_enum_from!( SonarrSerdeable { AddSeriesSearchResults(Vec),