style: Applied uniform formatting across all new Lidarr files

This commit is contained in:
2026-01-05 15:46:16 -07:00
parent 6771a0ab38
commit 059fa48bd9
26 changed files with 90 additions and 99 deletions
+4 -4
View File
@@ -1,12 +1,12 @@
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::app::App;
use crate::app::context_clues::ContextClueProvider; use crate::app::context_clues::ContextClueProvider;
use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::lidarr::lidarr_context_clues::{LidarrContextClueProvider, ARTISTS_CONTEXT_CLUES}; use crate::app::lidarr::lidarr_context_clues::{
use crate::app::App; ARTISTS_CONTEXT_CLUES, LidarrContextClueProvider,
use crate::models::servarr_data::lidarr::lidarr_data::{
ActiveLidarrBlock,
}; };
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
#[test] #[test]
+4 -2
View File
@@ -1,10 +1,10 @@
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use pretty_assertions::assert_eq;
use crate::app::App; use crate::app::App;
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock; use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::network::NetworkEvent; use crate::network::NetworkEvent;
use crate::network::lidarr_network::LidarrEvent; use crate::network::lidarr_network::LidarrEvent;
use pretty_assertions::assert_eq;
use tokio::sync::mpsc; use tokio::sync::mpsc;
#[tokio::test] #[tokio::test]
@@ -13,7 +13,9 @@ mod tests {
let mut app = App::test_default(); let mut app = App::test_default();
app.network_tx = Some(tx); app.network_tx = Some(tx);
app.dispatch_by_lidarr_block(&ActiveLidarrBlock::Artists).await; app
.dispatch_by_lidarr_block(&ActiveLidarrBlock::Artists)
.await;
assert!(app.is_loading); assert!(app.is_loading);
assert_eq!( assert_eq!(
+1 -1
View File
@@ -26,9 +26,9 @@ mod app_tests;
pub mod context_clues; pub mod context_clues;
pub mod key_binding; pub mod key_binding;
mod key_binding_tests; mod key_binding_tests;
pub mod lidarr;
pub mod radarr; pub mod radarr;
pub mod sonarr; pub mod sonarr;
pub mod lidarr;
pub struct App<'a> { pub struct App<'a> {
navigation_stack: Vec<Route>, navigation_stack: Vec<Route>,
+4 -4
View File
@@ -2,16 +2,18 @@
mod tests { mod tests {
use std::sync::Arc; use std::sync::Arc;
use clap::{error::ErrorKind, CommandFactory}; use clap::{CommandFactory, error::ErrorKind};
use mockall::predicate::eq; use mockall::predicate::eq;
use rstest::rstest; use rstest::rstest;
use serde_json::json; use serde_json::json;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use crate::{ use crate::{
Cli,
app::App, app::App,
cli::{handle_command, mutex_flags_or_option, radarr::RadarrCommand, sonarr::SonarrCommand}, cli::{handle_command, mutex_flags_or_option, radarr::RadarrCommand, sonarr::SonarrCommand},
models::{ models::{
Serdeable,
radarr_models::{ radarr_models::{
BlocklistItem as RadarrBlocklistItem, BlocklistResponse as RadarrBlocklistResponse, BlocklistItem as RadarrBlocklistItem, BlocklistResponse as RadarrBlocklistResponse,
RadarrSerdeable, RadarrSerdeable,
@@ -20,12 +22,10 @@ mod tests {
BlocklistItem as SonarrBlocklistItem, BlocklistResponse as SonarrBlocklistResponse, BlocklistItem as SonarrBlocklistItem, BlocklistResponse as SonarrBlocklistResponse,
SonarrSerdeable, SonarrSerdeable,
}, },
Serdeable,
}, },
network::{ network::{
radarr_network::RadarrEvent, sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent, MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent, sonarr_network::SonarrEvent,
}, },
Cli,
}; };
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
@@ -29,8 +29,7 @@ mod tests {
#[test] #[test]
fn test_delete_artist_requires_arguments() { fn test_delete_artist_requires_arguments() {
let result = let result = Cli::command().try_get_matches_from(["managarr", "lidarr", "delete", "artist"]);
Cli::command().try_get_matches_from(["managarr", "lidarr", "delete", "artist"]);
assert_err!(&result); assert_err!(&result);
assert_eq!( assert_eq!(
+5 -6
View File
@@ -1,10 +1,10 @@
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::cli::{
lidarr::{list_command_handler::LidarrListCommand, LidarrCommand},
Command,
};
use crate::Cli; use crate::Cli;
use crate::cli::{
Command,
lidarr::{LidarrCommand, list_command_handler::LidarrListCommand},
};
use clap::CommandFactory; use clap::CommandFactory;
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
@@ -54,8 +54,7 @@ mod tests {
cli::{ cli::{
CliCommandHandler, CliCommandHandler,
lidarr::{ lidarr::{
LidarrCliHandler, LidarrCommand, LidarrCliHandler, LidarrCommand, delete_command_handler::LidarrDeleteCommand,
delete_command_handler::LidarrDeleteCommand,
list_command_handler::LidarrListCommand, list_command_handler::LidarrListCommand,
}, },
}, },
+9 -9
View File
@@ -9,23 +9,23 @@ mod tests {
use rstest::rstest; use rstest::rstest;
use tokio_util::sync::CancellationToken; use tokio_util::sync::CancellationToken;
use crate::app::App;
use crate::app::context_clues::SERVARR_CONTEXT_CLUES; use crate::app::context_clues::SERVARR_CONTEXT_CLUES;
use crate::app::key_binding::{KeyBinding, DEFAULT_KEYBINDINGS}; use crate::app::key_binding::{DEFAULT_KEYBINDINGS, KeyBinding};
use crate::app::radarr::radarr_context_clues::{ use crate::app::radarr::radarr_context_clues::{
LIBRARY_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES,
}; };
use crate::app::App;
use crate::event::Key; use crate::event::Key;
use crate::handlers::{handle_clear_errors, handle_prompt_toggle}; use crate::handlers::{handle_clear_errors, handle_prompt_toggle};
use crate::handlers::{handle_events, populate_keymapping_table}; use crate::handlers::{handle_events, populate_keymapping_table};
use crate::models::HorizontallyScrollableText;
use crate::models::Route;
use crate::models::servarr_data::ActiveKeybindingBlock;
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock; use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData};
use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
use crate::models::servarr_data::ActiveKeybindingBlock;
use crate::models::servarr_models::KeybindingItem; use crate::models::servarr_models::KeybindingItem;
use crate::models::stateful_table::StatefulTable; use crate::models::stateful_table::StatefulTable;
use crate::models::HorizontallyScrollableText;
use crate::models::Route;
#[test] #[test]
fn test_handle_clear_errors() { fn test_handle_clear_errors() {
@@ -128,8 +128,8 @@ mod tests {
} }
#[test] #[test]
fn test_handle_empties_keybindings_table_on_help_button_press_when_keybindings_table_is_already_populated( fn test_handle_empties_keybindings_table_on_help_button_press_when_keybindings_table_is_already_populated()
) { {
let mut app = App::test_default(); let mut app = App::test_default();
let keybinding_items = Vec::from(SERVARR_CONTEXT_CLUES) let keybinding_items = Vec::from(SERVARR_CONTEXT_CLUES)
.iter() .iter()
@@ -260,8 +260,8 @@ mod tests {
} }
#[test] #[test]
fn test_populate_keymapping_table_populates_delegated_servarr_context_provider_options_before_global_options( fn test_populate_keymapping_table_populates_delegated_servarr_context_provider_options_before_global_options()
) { {
let mut expected_keybinding_items = MOVIE_DETAILS_CONTEXT_CLUES let mut expected_keybinding_items = MOVIE_DETAILS_CONTEXT_CLUES
.iter() .iter()
.map(|(key, desc)| context_clue_to_keybinding_item(key, desc)) .map(|(key, desc)| context_clue_to_keybinding_item(key, desc))
@@ -6,8 +6,8 @@ mod tests {
use serde_json::Number; use serde_json::Number;
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use crate::handlers::lidarr_handlers::library::{LibraryHandler, artists_sorting_options};
use crate::handlers::KeyEventHandler; use crate::handlers::KeyEventHandler;
use crate::handlers::lidarr_handlers::library::{LibraryHandler, artists_sorting_options};
use crate::models::lidarr_models::{Artist, ArtistStatistics, ArtistStatus}; use crate::models::lidarr_models::{Artist, ArtistStatistics, ArtistStatus};
use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, LIBRARY_BLOCKS}; use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, LIBRARY_BLOCKS};
+9 -10
View File
@@ -33,16 +33,15 @@ pub(super) struct LibraryHandler<'a, 'b> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for LibraryHandler<'a, 'b> { impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for LibraryHandler<'a, 'b> {
fn handle(&mut self) { fn handle(&mut self) {
let artists_table_handling_config = let artists_table_handling_config = TableHandlingConfig::new(ActiveLidarrBlock::Artists.into())
TableHandlingConfig::new(ActiveLidarrBlock::Artists.into()) .sorting_block(ActiveLidarrBlock::ArtistsSortPrompt.into())
.sorting_block(ActiveLidarrBlock::ArtistsSortPrompt.into()) .sort_options(artists_sorting_options())
.sort_options(artists_sorting_options()) .searching_block(ActiveLidarrBlock::SearchArtists.into())
.searching_block(ActiveLidarrBlock::SearchArtists.into()) .search_error_block(ActiveLidarrBlock::SearchArtistsError.into())
.search_error_block(ActiveLidarrBlock::SearchArtistsError.into()) .search_field_fn(|artist| &artist.artist_name.text)
.search_field_fn(|artist| &artist.artist_name.text) .filtering_block(ActiveLidarrBlock::FilterArtists.into())
.filtering_block(ActiveLidarrBlock::FilterArtists.into()) .filter_error_block(ActiveLidarrBlock::FilterArtistsError.into())
.filter_error_block(ActiveLidarrBlock::FilterArtistsError.into()) .filter_field_fn(|artist| &artist.artist_name.text);
.filter_field_fn(|artist| &artist.artist_name.text);
if !handle_table( if !handle_table(
self, self,
+1 -10
View File
@@ -37,16 +37,7 @@ pub struct Artist {
} }
#[derive( #[derive(
Serialize, Serialize, Deserialize, Default, PartialEq, Eq, Clone, Copy, Debug, Display, EnumDisplayStyle,
Deserialize,
Default,
PartialEq,
Eq,
Clone,
Copy,
Debug,
Display,
EnumDisplayStyle,
)] )]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
#[strum(serialize_all = "camelCase")] #[strum(serialize_all = "camelCase")]
+1 -1
View File
@@ -4,8 +4,8 @@ mod tests {
use serde_json::json; use serde_json::json;
use crate::models::{ use crate::models::{
lidarr_models::{Artist, ArtistStatistics, ArtistStatus, LidarrSerdeable, Ratings},
Serdeable, Serdeable,
lidarr_models::{Artist, ArtistStatistics, ArtistStatus, LidarrSerdeable, Ratings},
}; };
#[test] #[test]
+2 -2
View File
@@ -1,14 +1,14 @@
use std::fmt::{Debug, Display, Formatter}; use std::fmt::{Debug, Display, Formatter};
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
use crate::app::context_clues::ContextClue;
use crate::app::ServarrConfig; use crate::app::ServarrConfig;
use crate::app::context_clues::ContextClue;
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock; use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use lidarr_models::LidarrSerdeable; use lidarr_models::LidarrSerdeable;
use radarr_models::RadarrSerdeable; use radarr_models::RadarrSerdeable;
use regex::Regex; use regex::Regex;
use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
use serde_json::Number; use serde_json::Number;
use servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use servarr_data::sonarr::sonarr_data::ActiveSonarrBlock;
use sonarr_models::SonarrSerdeable; use sonarr_models::SonarrSerdeable;
+17 -15
View File
@@ -1,8 +1,3 @@
use bimap::BiMap;
use chrono::{DateTime, Utc};
use strum::EnumIter;
#[cfg(test)]
use strum::{Display, EnumString};
use crate::app::lidarr::lidarr_context_clues::ARTISTS_CONTEXT_CLUES; use crate::app::lidarr::lidarr_context_clues::ARTISTS_CONTEXT_CLUES;
use crate::models::{ use crate::models::{
Route, TabRoute, TabState, Route, TabRoute, TabState,
@@ -11,6 +6,11 @@ use crate::models::{
stateful_table::StatefulTable, stateful_table::StatefulTable,
}; };
use crate::network::lidarr_network::LidarrEvent; use crate::network::lidarr_network::LidarrEvent;
use bimap::BiMap;
use chrono::{DateTime, Utc};
use strum::EnumIter;
#[cfg(test)]
use strum::{Display, EnumString};
#[cfg(test)] #[cfg(test)]
#[path = "lidarr_data_tests.rs"] #[path = "lidarr_data_tests.rs"]
@@ -58,14 +58,12 @@ impl<'a> Default for LidarrData<'a> {
start_time: Utc::now(), start_time: Utc::now(),
tags_map: BiMap::new(), tags_map: BiMap::new(),
version: String::new(), version: String::new(),
main_tabs: TabState::new(vec![ main_tabs: TabState::new(vec![TabRoute {
TabRoute { title: "Library".to_string(),
title: "Library".to_string(), route: ActiveLidarrBlock::Artists.into(),
route: ActiveLidarrBlock::Artists.into(), contextual_help: Some(&ARTISTS_CONTEXT_CLUES),
contextual_help: Some(&ARTISTS_CONTEXT_CLUES), config: None,
config: None, }]),
},
]),
} }
} }
} }
@@ -92,8 +90,12 @@ impl LidarrData<'_> {
free_space: 50000000000, free_space: 50000000000,
total_space: 100000000000, total_space: 100000000000,
}]; }];
lidarr_data.downloads.set_items(vec![DownloadRecord::default()]); lidarr_data
lidarr_data.root_folders.set_items(vec![RootFolder::default()]); .downloads
.set_items(vec![DownloadRecord::default()]);
lidarr_data
.root_folders
.set_items(vec![RootFolder::default()]);
lidarr_data.version = "1.0.0".to_owned(); lidarr_data.version = "1.0.0".to_owned();
lidarr_data lidarr_data
@@ -3,8 +3,8 @@ mod tests {
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use crate::models::{ use crate::models::{
servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, LidarrData},
Route, Route,
servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, LidarrData},
}; };
#[test] #[test]
@@ -25,7 +25,7 @@ mod tests {
#[test] #[test]
fn test_reset_delete_artist_preferences() { fn test_reset_delete_artist_preferences() {
let mut lidarr_data = LidarrData{ let mut lidarr_data = LidarrData {
delete_artist_files: true, delete_artist_files: true,
add_import_list_exclusion: true, add_import_list_exclusion: true,
..LidarrData::default() ..LidarrData::default()
+1 -1
View File
@@ -1,9 +1,9 @@
use crate::models::Route; use crate::models::Route;
pub mod lidarr;
pub mod modals; pub mod modals;
pub mod radarr; pub mod radarr;
pub mod sonarr; pub mod sonarr;
pub mod lidarr;
#[cfg(test)] #[cfg(test)]
pub(in crate::models::servarr_data) mod data_test_utils; pub(in crate::models::servarr_data) mod data_test_utils;
+1 -1
View File
@@ -1,9 +1,9 @@
use anyhow::Result; use anyhow::Result;
use log::info; use log::info;
use crate::models::Route;
use crate::models::lidarr_models::{Artist, DeleteArtistParams}; use crate::models::lidarr_models::{Artist, DeleteArtistParams};
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock; use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::models::Route;
use crate::network::lidarr_network::LidarrEvent; use crate::network::lidarr_network::LidarrEvent;
use crate::network::{Network, RequestMethod}; use crate::network::{Network, RequestMethod};
@@ -3,7 +3,7 @@ mod tests {
use crate::models::lidarr_models::{LidarrSerdeable, MetadataProfile}; use crate::models::lidarr_models::{LidarrSerdeable, MetadataProfile};
use crate::models::servarr_models::{QualityProfile, Tag}; use crate::models::servarr_models::{QualityProfile, Tag};
use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::network_tests::test_utils::{MockServarrApi, test_network};
use crate::network::{lidarr_network::LidarrEvent, NetworkEvent, NetworkResource}; use crate::network::{NetworkEvent, NetworkResource, lidarr_network::LidarrEvent};
use pretty_assertions::{assert_eq, assert_str_eq}; use pretty_assertions::{assert_eq, assert_str_eq};
use rstest::rstest; use rstest::rstest;
use serde_json::json; use serde_json::json;
+2 -8
View File
@@ -60,10 +60,7 @@ impl Network<'_, '_> {
LidarrEvent::DeleteArtist(params) => { LidarrEvent::DeleteArtist(params) => {
self.delete_artist(params).await.map(LidarrSerdeable::from) self.delete_artist(params).await.map(LidarrSerdeable::from)
} }
LidarrEvent::GetDiskSpace => self LidarrEvent::GetDiskSpace => self.get_lidarr_diskspace().await.map(LidarrSerdeable::from),
.get_lidarr_diskspace()
.await
.map(LidarrSerdeable::from),
LidarrEvent::GetDownloads(count) => self LidarrEvent::GetDownloads(count) => self
.get_lidarr_downloads(count) .get_lidarr_downloads(count)
.await .await
@@ -80,10 +77,7 @@ impl Network<'_, '_> {
.get_lidarr_root_folders() .get_lidarr_root_folders()
.await .await
.map(LidarrSerdeable::from), .map(LidarrSerdeable::from),
LidarrEvent::GetStatus => self LidarrEvent::GetStatus => self.get_lidarr_status().await.map(LidarrSerdeable::from),
.get_lidarr_status()
.await
.map(LidarrSerdeable::from),
LidarrEvent::GetTags => self.get_lidarr_tags().await.map(LidarrSerdeable::from), LidarrEvent::GetTags => self.get_lidarr_tags().await.map(LidarrSerdeable::from),
LidarrEvent::HealthCheck => self LidarrEvent::HealthCheck => self
.get_lidarr_healthcheck() .get_lidarr_healthcheck()
+1 -1
View File
@@ -3,12 +3,12 @@ use std::sync::Arc;
use anyhow::{Result, anyhow}; use anyhow::{Result, anyhow};
use async_trait::async_trait; use async_trait::async_trait;
use lidarr_network::LidarrEvent;
use log::{debug, error, warn}; use log::{debug, error, warn};
use regex::Regex; use regex::Regex;
use reqwest::{Client, RequestBuilder}; use reqwest::{Client, RequestBuilder};
use serde::Serialize; use serde::Serialize;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use lidarr_network::LidarrEvent;
use sonarr_network::SonarrEvent; use sonarr_network::SonarrEvent;
use strum_macros::Display; use strum_macros::Display;
use tokio::select; use tokio::select;
+7 -1
View File
@@ -31,7 +31,13 @@ impl DrawUi for DeleteArtistUi {
let selected_block = app.data.lidarr_data.selected_block.get_active_block(); let selected_block = app.data.lidarr_data.selected_block.get_active_block();
let prompt = format!( let prompt = format!(
"Do you really want to delete the artist: \n{}?", "Do you really want to delete the artist: \n{}?",
app.data.lidarr_data.artists.current_selection().artist_name.text app
.data
.lidarr_data
.artists
.current_selection()
.artist_name
.text
); );
let checkboxes = vec![ let checkboxes = vec![
Checkbox::new("Delete Artist Files") Checkbox::new("Delete Artist Files")
+2 -2
View File
@@ -6,9 +6,9 @@ mod tests {
use crate::models::servarr_data::lidarr::lidarr_data::{ use crate::models::servarr_data::lidarr::lidarr_data::{
ActiveLidarrBlock, DELETE_ARTIST_BLOCKS, LIBRARY_BLOCKS, ActiveLidarrBlock, DELETE_ARTIST_BLOCKS, LIBRARY_BLOCKS,
}; };
use crate::ui::DrawUi;
use crate::ui::lidarr_ui::library::{LibraryUi, decorate_artist_row_with_style}; use crate::ui::lidarr_ui::library::{LibraryUi, decorate_artist_row_with_style};
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::DrawUi;
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use ratatui::widgets::{Cell, Row}; use ratatui::widgets::{Cell, Row};
@@ -183,9 +183,9 @@ mod tests {
}; };
use rstest::rstest; use rstest::rstest;
use crate::ui::DrawUi;
use crate::ui::lidarr_ui::library::LibraryUi; use crate::ui::lidarr_ui::library::LibraryUi;
use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app};
use crate::ui::DrawUi;
#[rstest] #[rstest]
fn test_library_ui_renders( fn test_library_ui_renders(
+3 -6
View File
@@ -84,12 +84,9 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) {
.statistics .statistics
.as_ref() .as_ref()
.map_or(0, |stats| stats.album_count); .map_or(0, |stats| stats.album_count);
let tracks = artist let tracks = artist.statistics.as_ref().map_or(String::new(), |stats| {
.statistics format!("{}/{}", stats.track_file_count, stats.total_track_count)
.as_ref() });
.map_or(String::new(), |stats| {
format!("{}/{}", stats.track_file_count, stats.total_track_count)
});
let tags = artist let tags = artist
.tags .tags
.iter() .iter()
+1 -1
View File
@@ -2,8 +2,8 @@
mod tests { mod tests {
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::models::Route; use crate::models::Route;
use crate::models::servarr_data::lidarr::lidarr_data::ActiveLidarrBlock;
use crate::ui::DrawUi; use crate::ui::DrawUi;
use crate::ui::lidarr_ui::LidarrUi; use crate::ui::lidarr_ui::LidarrUi;
+3 -1
View File
@@ -29,7 +29,9 @@ use crate::{
use super::{ use super::{
DrawUi, draw_tabs, DrawUi, draw_tabs,
styles::ManagarrStyle, styles::ManagarrStyle,
utils::{borderless_block, layout_block, line_gauge_with_label, line_gauge_with_title, title_block}, utils::{
borderless_block, layout_block, line_gauge_with_label, line_gauge_with_title, title_block,
},
widgets::loading_block::LoadingBlock, widgets::loading_block::LoadingBlock,
}; };
+1 -1
View File
@@ -1,6 +1,7 @@
use std::cell::Cell; use std::cell::Cell;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use lidarr_ui::LidarrUi;
use ratatui::Frame; use ratatui::Frame;
use ratatui::layout::{Constraint, Flex, Layout, Rect}; use ratatui::layout::{Constraint, Flex, Layout, Rect};
use ratatui::style::{Style, Stylize}; use ratatui::style::{Style, Stylize};
@@ -9,7 +10,6 @@ use ratatui::widgets::Paragraph;
use ratatui::widgets::Tabs; use ratatui::widgets::Tabs;
use ratatui::widgets::Wrap; use ratatui::widgets::Wrap;
use ratatui::widgets::{Clear, Row}; use ratatui::widgets::{Clear, Row};
use lidarr_ui::LidarrUi;
use sonarr_ui::SonarrUi; use sonarr_ui::SonarrUi;
use utils::layout_block; use utils::layout_block;
+3 -3
View File
@@ -6,10 +6,10 @@ use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
use anyhow::Result; use anyhow::Result;
use anyhow::{anyhow, Context}; use anyhow::{Context, anyhow};
use colored::Colorize; use colored::Colorize;
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
use log::{error, LevelFilter}; use log::{LevelFilter, error};
use log4rs::append::file::FileAppender; use log4rs::append::file::FileAppender;
use log4rs::config::{Appender, Root}; use log4rs::config::{Appender, Root};
use log4rs::encode::pattern::PatternEncoder; use log4rs::encode::pattern::PatternEncoder;
@@ -18,7 +18,7 @@ use reqwest::{Certificate, Client};
use tokio::sync::Mutex; use tokio::sync::Mutex;
use tokio_util::sync::CancellationToken; use tokio_util::sync::CancellationToken;
use crate::app::{log_and_print_error, App, AppConfig}; use crate::app::{App, AppConfig, log_and_print_error};
use crate::cli::{self, Command}; use crate::cli::{self, Command};
use crate::network::Network; use crate::network::Network;
use crate::ui::theme::ThemeDefinitionsWrapper; use crate::ui::theme::ThemeDefinitionsWrapper;