feat(cli): Added a spinner to the CLI for long running commands like fetching releases
This commit is contained in:
+6
-19
@@ -42,15 +42,15 @@ pub enum Command {
|
||||
|
||||
pub trait CliCommandHandler<'a, 'b, T: Into<Command>> {
|
||||
fn with(app: &'a Arc<Mutex<App<'b>>>, command: T, network: &'a mut dyn NetworkTrait) -> Self;
|
||||
async fn handle(self) -> Result<()>;
|
||||
async fn handle(self) -> Result<String>;
|
||||
}
|
||||
|
||||
pub(crate) async fn handle_command(
|
||||
app: &Arc<Mutex<App<'_>>>,
|
||||
command: Command,
|
||||
network: &mut dyn NetworkTrait,
|
||||
) -> Result<()> {
|
||||
match command {
|
||||
) -> Result<String> {
|
||||
let result = match command {
|
||||
Command::Radarr(radarr_command) => {
|
||||
RadarrCliHandler::with(app, radarr_command, network)
|
||||
.handle()
|
||||
@@ -61,10 +61,10 @@ pub(crate) async fn handle_command(
|
||||
.handle()
|
||||
.await?
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
_ => String::new(),
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -88,16 +88,3 @@ pub fn mutex_flags_or_default(positive: bool, negative: bool, default_value: boo
|
||||
default_value
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! execute_network_event {
|
||||
($self:ident, $event:expr) => {
|
||||
let resp = $self.network.handle_network_event($event.into()).await?;
|
||||
let json = serde_json::to_string_pretty(&resp)?;
|
||||
println!("{}", json);
|
||||
};
|
||||
($self:ident, $event:expr, $happy_output:expr) => {
|
||||
$self.network.handle_network_event($event.into()).await?;
|
||||
println!("{}", $happy_output);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
models::radarr_models::{AddMovieBody, AddOptions, MinimumAvailability, Monitor},
|
||||
network::{radarr_network::RadarrEvent, NetworkTrait},
|
||||
};
|
||||
@@ -106,8 +105,8 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrAddCommand> for RadarrAddCommandHan
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrAddCommand::Movie {
|
||||
tmdb_id,
|
||||
root_folder_path,
|
||||
@@ -131,19 +130,28 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrAddCommand> for RadarrAddCommandHan
|
||||
search_for_movie: !no_search_for_movie,
|
||||
},
|
||||
};
|
||||
execute_network_event!(self, RadarrEvent::AddMovie(Some(body)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::AddMovie(Some(body))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrAddCommand::RootFolder { root_folder_path } => {
|
||||
execute_network_event!(
|
||||
self,
|
||||
RadarrEvent::AddRootFolder(Some(root_folder_path.clone()))
|
||||
);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::AddRootFolder(Some(root_folder_path.clone()))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrAddCommand::Tag { name } => {
|
||||
execute_network_event!(self, RadarrEvent::AddTag(name.clone()));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::AddTag(name.clone())).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
models::radarr_models::DeleteMovieParams,
|
||||
network::{radarr_network::RadarrEvent, NetworkTrait},
|
||||
};
|
||||
@@ -85,19 +84,28 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrDeleteCommand> for RadarrDeleteComm
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrDeleteCommand::BlocklistItem { blocklist_item_id } => {
|
||||
execute_network_event!(
|
||||
self,
|
||||
RadarrEvent::DeleteBlocklistItem(Some(blocklist_item_id))
|
||||
);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DeleteBlocklistItem(Some(blocklist_item_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrDeleteCommand::Download { download_id } => {
|
||||
execute_network_event!(self, RadarrEvent::DeleteDownload(Some(download_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DeleteDownload(Some(download_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrDeleteCommand::Indexer { indexer_id } => {
|
||||
execute_network_event!(self, RadarrEvent::DeleteIndexer(Some(indexer_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DeleteIndexer(Some(indexer_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrDeleteCommand::Movie {
|
||||
movie_id,
|
||||
@@ -109,16 +117,28 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrDeleteCommand> for RadarrDeleteComm
|
||||
delete_movie_files: delete_files_from_disk,
|
||||
add_list_exclusion,
|
||||
};
|
||||
execute_network_event!(self, RadarrEvent::DeleteMovie(Some(delete_movie_params)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DeleteMovie(Some(delete_movie_params))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrDeleteCommand::RootFolder { root_folder_id } => {
|
||||
execute_network_event!(self, RadarrEvent::DeleteRootFolder(Some(root_folder_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DeleteRootFolder(Some(root_folder_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrDeleteCommand::Tag { tag_id } => {
|
||||
execute_network_event!(self, RadarrEvent::DeleteTag(tag_id));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DeleteTag(tag_id)).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{mutex_flags_or_default, mutex_flags_or_option, CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
models::{
|
||||
radarr_models::{
|
||||
EditCollectionParams, EditIndexerParams, EditMovieParams, IndexerSettings,
|
||||
@@ -339,8 +338,8 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrEditCommand> for RadarrEditCommandH
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrEditCommand::AllIndexerSettings {
|
||||
allow_hardcoded_subs,
|
||||
disable_allow_hardcoded_subs,
|
||||
@@ -389,11 +388,13 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrEditCommand> for RadarrEditCommandH
|
||||
})
|
||||
.into(),
|
||||
};
|
||||
execute_network_event!(
|
||||
self,
|
||||
RadarrEvent::EditAllIndexerSettings(Some(params)),
|
||||
"All indexer settings updated"
|
||||
);
|
||||
self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::EditAllIndexerSettings(Some(params))).into())
|
||||
.await?;
|
||||
"All indexer settings updated".to_owned()
|
||||
} else {
|
||||
String::new()
|
||||
}
|
||||
}
|
||||
RadarrEditCommand::Collection {
|
||||
@@ -417,11 +418,11 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrEditCommand> for RadarrEditCommandH
|
||||
root_folder_path,
|
||||
search_on_add: search_on_add_value,
|
||||
};
|
||||
execute_network_event!(
|
||||
self,
|
||||
RadarrEvent::EditCollection(Some(edit_collection_params)),
|
||||
"Collection Updated"
|
||||
);
|
||||
self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::EditCollection(Some(edit_collection_params))).into())
|
||||
.await?;
|
||||
"Collection updated".to_owned()
|
||||
}
|
||||
RadarrEditCommand::Indexer {
|
||||
indexer_id,
|
||||
@@ -458,11 +459,11 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrEditCommand> for RadarrEditCommandH
|
||||
clear_tags,
|
||||
};
|
||||
|
||||
execute_network_event!(
|
||||
self,
|
||||
RadarrEvent::EditIndexer(Some(edit_indexer_params)),
|
||||
"Indexer updated"
|
||||
);
|
||||
self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::EditIndexer(Some(edit_indexer_params))).into())
|
||||
.await?;
|
||||
"Indexer updated".to_owned()
|
||||
}
|
||||
RadarrEditCommand::Movie {
|
||||
movie_id,
|
||||
@@ -485,14 +486,14 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrEditCommand> for RadarrEditCommandH
|
||||
clear_tags,
|
||||
};
|
||||
|
||||
execute_network_event!(
|
||||
self,
|
||||
RadarrEvent::EditMovie(Some(edit_movie_params)),
|
||||
"Movie updated"
|
||||
);
|
||||
self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::EditMovie(Some(edit_movie_params))).into())
|
||||
.await?;
|
||||
"Movie Updated".to_owned()
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
network::{radarr_network::RadarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -72,28 +71,52 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrGetCommand> for RadarrGetCommandHan
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrGetCommand::AllIndexerSettings => {
|
||||
execute_network_event!(self, RadarrEvent::GetAllIndexerSettings);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetAllIndexerSettings).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrGetCommand::HostConfig => {
|
||||
execute_network_event!(self, RadarrEvent::GetHostConfig);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetHostConfig).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrGetCommand::MovieDetails { movie_id } => {
|
||||
execute_network_event!(self, RadarrEvent::GetMovieDetails(Some(movie_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetMovieDetails(Some(movie_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrGetCommand::MovieHistory { movie_id } => {
|
||||
execute_network_event!(self, RadarrEvent::GetMovieHistory(Some(movie_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetMovieHistory(Some(movie_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrGetCommand::SecurityConfig => {
|
||||
execute_network_event!(self, RadarrEvent::GetSecurityConfig);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetSecurityConfig).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrGetCommand::SystemStatus => {
|
||||
execute_network_event!(self, RadarrEvent::GetStatus);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetStatus).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
network::{radarr_network::RadarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -87,19 +86,35 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrListCommand> for RadarrListCommandH
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrListCommand::Blocklist => {
|
||||
execute_network_event!(self, RadarrEvent::GetBlocklist);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetBlocklist).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Collections => {
|
||||
execute_network_event!(self, RadarrEvent::GetCollections);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetCollections).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Downloads => {
|
||||
execute_network_event!(self, RadarrEvent::GetDownloads);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetDownloads).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Indexers => {
|
||||
execute_network_event!(self, RadarrEvent::GetIndexers);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetIndexers).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Logs {
|
||||
events,
|
||||
@@ -113,39 +128,69 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrListCommand> for RadarrListCommandH
|
||||
if output_in_log_format {
|
||||
let log_lines = self.app.lock().await.data.radarr_data.logs.items.clone();
|
||||
|
||||
let json = serde_json::to_string_pretty(&log_lines)?;
|
||||
println!("{}", json);
|
||||
serde_json::to_string_pretty(&log_lines)?
|
||||
} else {
|
||||
let json = serde_json::to_string_pretty(&logs)?;
|
||||
println!("{}", json);
|
||||
serde_json::to_string_pretty(&logs)?
|
||||
}
|
||||
}
|
||||
RadarrListCommand::Movies => {
|
||||
execute_network_event!(self, RadarrEvent::GetMovies);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetMovies).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::MovieCredits { movie_id } => {
|
||||
execute_network_event!(self, RadarrEvent::GetMovieCredits(Some(movie_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetMovieCredits(Some(movie_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::QualityProfiles => {
|
||||
execute_network_event!(self, RadarrEvent::GetQualityProfiles);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetQualityProfiles).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::QueuedEvents => {
|
||||
execute_network_event!(self, RadarrEvent::GetQueuedEvents);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetQueuedEvents).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::RootFolders => {
|
||||
execute_network_event!(self, RadarrEvent::GetRootFolders);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetRootFolders).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Tags => {
|
||||
execute_network_event!(self, RadarrEvent::GetTags);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetTags).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Tasks => {
|
||||
execute_network_event!(self, RadarrEvent::GetTasks);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetTasks).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrListCommand::Updates => {
|
||||
execute_network_event!(self, RadarrEvent::GetUpdates);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetUpdates).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
+44
-13
@@ -12,7 +12,6 @@ use tokio::sync::Mutex;
|
||||
use crate::app::App;
|
||||
|
||||
use crate::cli::CliCommandHandler;
|
||||
use crate::execute_network_event;
|
||||
use crate::models::radarr_models::{ReleaseDownloadBody, TaskName};
|
||||
use crate::network::radarr_network::RadarrEvent;
|
||||
use crate::network::NetworkTrait;
|
||||
@@ -155,8 +154,8 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrCommand> for RadarrCliHandler<'a, '
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrCommand::Add(add_command) => {
|
||||
RadarrAddCommandHandler::with(self.app, add_command, self.network)
|
||||
.handle()
|
||||
@@ -192,7 +191,11 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrCommand> for RadarrCliHandler<'a, '
|
||||
.network
|
||||
.handle_network_event(RadarrEvent::GetBlocklist.into())
|
||||
.await?;
|
||||
execute_network_event!(self, RadarrEvent::ClearBlocklist);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::ClearBlocklist).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::DownloadRelease {
|
||||
guid,
|
||||
@@ -204,29 +207,57 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrCommand> for RadarrCliHandler<'a, '
|
||||
indexer_id,
|
||||
movie_id,
|
||||
};
|
||||
execute_network_event!(self, RadarrEvent::DownloadRelease(Some(params)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::DownloadRelease(Some(params))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::ManualSearch { movie_id } => {
|
||||
println!("Searching for releases. This may take a minute...");
|
||||
execute_network_event!(self, RadarrEvent::GetReleases(Some(movie_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::GetReleases(Some(movie_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::SearchNewMovie { query } => {
|
||||
execute_network_event!(self, RadarrEvent::SearchNewMovie(Some(query)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::SearchNewMovie(Some(query))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::StartTask { task_name } => {
|
||||
execute_network_event!(self, RadarrEvent::StartTask(Some(task_name)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::StartTask(Some(task_name))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::TestIndexer { indexer_id } => {
|
||||
execute_network_event!(self, RadarrEvent::TestIndexer(Some(indexer_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::TestIndexer(Some(indexer_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::TestAllIndexers => {
|
||||
execute_network_event!(self, RadarrEvent::TestAllIndexers);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::TestAllIndexers).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrCommand::TriggerAutomaticSearch { movie_id } => {
|
||||
execute_network_event!(self, RadarrEvent::TriggerAutomaticSearch(Some(movie_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::TriggerAutomaticSearch(Some(movie_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
network::{radarr_network::RadarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -63,22 +62,38 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrRefreshCommand>
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
RadarrRefreshCommand::AllMovies => {
|
||||
execute_network_event!(self, RadarrEvent::UpdateAllMovies);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::UpdateAllMovies).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrRefreshCommand::Collections => {
|
||||
execute_network_event!(self, RadarrEvent::UpdateCollections);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::UpdateCollections).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrRefreshCommand::Downloads => {
|
||||
execute_network_event!(self, RadarrEvent::UpdateDownloads);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::UpdateDownloads).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
RadarrRefreshCommand::Movie { movie_id } => {
|
||||
execute_network_event!(self, RadarrEvent::UpdateAndScan(Some(movie_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((RadarrEvent::UpdateAndScan(Some(movie_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
network::{sonarr_network::SonarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -55,16 +54,17 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrDeleteCommand> for SonarrDeleteComm
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let resp = match self.command {
|
||||
SonarrDeleteCommand::BlocklistItem { blocklist_item_id } => {
|
||||
execute_network_event!(
|
||||
self,
|
||||
SonarrEvent::DeleteBlocklistItem(Some(blocklist_item_id))
|
||||
);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::DeleteBlocklistItem(Some(blocklist_item_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(resp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
network::{sonarr_network::SonarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -72,28 +71,52 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrGetCommand> for SonarrGetCommandHan
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
SonarrGetCommand::AllIndexerSettings => {
|
||||
execute_network_event!(self, SonarrEvent::GetAllIndexerSettings);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetAllIndexerSettings).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrGetCommand::EpisodeDetails { episode_id } => {
|
||||
execute_network_event!(self, SonarrEvent::GetEpisodeDetails(Some(episode_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetEpisodeDetails(Some(episode_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrGetCommand::HostConfig => {
|
||||
execute_network_event!(self, SonarrEvent::GetHostConfig);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetHostConfig).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrGetCommand::SecurityConfig => {
|
||||
execute_network_event!(self, SonarrEvent::GetSecurityConfig);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetSecurityConfig).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrGetCommand::SeriesDetails { series_id } => {
|
||||
execute_network_event!(self, SonarrEvent::GetSeriesDetails(Some(series_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetSeriesDetails(Some(series_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrGetCommand::SystemStatus => {
|
||||
execute_network_event!(self, SonarrEvent::GetStatus);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetStatus).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ use tokio::sync::Mutex;
|
||||
use crate::{
|
||||
app::App,
|
||||
cli::{CliCommandHandler, Command},
|
||||
execute_network_event,
|
||||
network::{sonarr_network::SonarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -91,22 +90,42 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrListCommand> for SonarrListCommandH
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
SonarrListCommand::Blocklist => {
|
||||
execute_network_event!(self, SonarrEvent::GetBlocklist);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetBlocklist).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::Downloads => {
|
||||
execute_network_event!(self, SonarrEvent::GetDownloads);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetDownloads).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::Episodes { series_id } => {
|
||||
execute_network_event!(self, SonarrEvent::GetEpisodes(Some(series_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetEpisodes(Some(series_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::History { events: items } => {
|
||||
execute_network_event!(self, SonarrEvent::GetHistory(Some(items)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetHistory(Some(items))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::Indexers => {
|
||||
execute_network_event!(self, SonarrEvent::GetIndexers);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetIndexers).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::Logs {
|
||||
events,
|
||||
@@ -120,27 +139,41 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrListCommand> for SonarrListCommandH
|
||||
if output_in_log_format {
|
||||
let log_lines = self.app.lock().await.data.sonarr_data.logs.items.clone();
|
||||
|
||||
let json = serde_json::to_string_pretty(&log_lines)?;
|
||||
println!("{}", json);
|
||||
serde_json::to_string_pretty(&log_lines)?
|
||||
} else {
|
||||
let json = serde_json::to_string_pretty(&logs)?;
|
||||
println!("{}", json);
|
||||
serde_json::to_string_pretty(&logs)?
|
||||
}
|
||||
}
|
||||
SonarrListCommand::QualityProfiles => {
|
||||
execute_network_event!(self, SonarrEvent::GetQualityProfiles);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetQualityProfiles).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::QueuedEvents => {
|
||||
execute_network_event!(self, SonarrEvent::GetQueuedEvents);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetQueuedEvents).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::Series => {
|
||||
execute_network_event!(self, SonarrEvent::ListSeries);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::ListSeries).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrListCommand::SeriesHistory { series_id } => {
|
||||
execute_network_event!(self, SonarrEvent::GetSeriesHistory(Some(series_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event((SonarrEvent::GetSeriesHistory(Some(series_id))).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
+21
-11
@@ -9,7 +9,6 @@ use tokio::sync::Mutex;
|
||||
|
||||
use crate::{
|
||||
app::App,
|
||||
execute_network_event,
|
||||
network::{sonarr_network::SonarrEvent, NetworkTrait},
|
||||
};
|
||||
|
||||
@@ -91,8 +90,8 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrCommand> for SonarrCliHandler<'a, '
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle(self) -> Result<()> {
|
||||
match self.command {
|
||||
async fn handle(self) -> Result<String> {
|
||||
let result = match self.command {
|
||||
SonarrCommand::Delete(delete_command) => {
|
||||
SonarrDeleteCommandHandler::with(self.app, delete_command, self.network)
|
||||
.handle()
|
||||
@@ -113,24 +112,35 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrCommand> for SonarrCliHandler<'a, '
|
||||
.network
|
||||
.handle_network_event(SonarrEvent::GetBlocklist.into())
|
||||
.await?;
|
||||
execute_network_event!(self, SonarrEvent::ClearBlocklist);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event(SonarrEvent::ClearBlocklist.into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrCommand::ManualEpisodeSearch { episode_id } => {
|
||||
println!("Searching for episode releases. This may take a minute...");
|
||||
execute_network_event!(self, SonarrEvent::GetEpisodeReleases(Some(episode_id)));
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event(SonarrEvent::GetEpisodeReleases(Some(episode_id)).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
SonarrCommand::ManualSeasonSearch {
|
||||
series_id,
|
||||
season_number,
|
||||
} => {
|
||||
println!("Searching for season releases. This may take a minute...");
|
||||
execute_network_event!(
|
||||
self,
|
||||
SonarrEvent::GetSeasonReleases(Some((series_id, season_number)))
|
||||
);
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event(
|
||||
SonarrEvent::GetSeasonReleases(Some((series_id, season_number))).into(),
|
||||
)
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user