Merge branch 'main' into var-interpolation

This commit is contained in:
tangowithfoxtrot
2025-01-26 14:36:45 -08:00
parent c4ace8c53f
commit 8d450dea5a
55 changed files with 103 additions and 58 deletions
Generated
+22
View File
@@ -1359,6 +1359,7 @@ dependencies = [
"tokio",
"tokio-util",
"urlencoding",
"veil",
]
[[package]]
@@ -2644,6 +2645,27 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "veil"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f00796f9c5969da55497f5c8802c2e69eaf21c0166fe28b6006c7c4699f4d0e"
dependencies = [
"once_cell",
"veil-macros",
]
[[package]]
name = "veil-macros"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b2d5567b6fbd34e8f0488d56b648e67c0d999535f4af2060d14f9074b43e833"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.90",
]
[[package]]
name = "wait-timeout"
version = "0.2.0"
+1
View File
@@ -54,6 +54,7 @@ derive_setters = "0.1.6"
deunicode = "1.6.0"
paste = "1.0.15"
openssl = { version = "0.10.68", features = ["vendored"] }
veil = "0.2.0"
[dev-dependencies]
assert_cmd = "2.0.16"
+19
View File
@@ -409,4 +409,23 @@ mod tests {
"https://dontdo:this@testing.com/query?test=%20query#results"
);
}
fn test_servarr_config_redacted_debug() {
let host = "localhost".to_owned();
let port = 1234;
let uri = "http://localhost:1234".to_owned();
let api_token = "thisisatest".to_owned();
let ssl_cert_path = "/some/path".to_owned();
let expected_str = format!("ServarrConfig {{ host: Some(\"{}\"), port: Some({}), uri: Some(\"{}\"), api_token: \"***********\", ssl_cert_path: Some(\"{}\") }}",
host, port, uri, ssl_cert_path);
let servarr_config = ServarrConfig {
host: Some(host),
port: Some(port),
uri: Some(uri),
api_token,
ssl_cert_path: Some(ssl_cert_path),
};
assert_str_eq!(format!("{servarr_config:?}"), expected_str);
}
}
+5 -3
View File
@@ -7,6 +7,7 @@ use regex::Regex;
use serde::{Deserialize, Serialize};
use tokio::sync::mpsc::Sender;
use tokio_util::sync::CancellationToken;
use veil::Redact;
use crate::app::context_clues::{build_context_clue_string, SERVARR_CONTEXT_CLUES};
use crate::cli::Command;
@@ -43,7 +44,7 @@ pub struct App<'a> {
pub data: Data<'a>,
}
impl<'a> App<'a> {
impl App<'_> {
pub fn new(
network_tx: Sender<NetworkEvent>,
config: AppConfig,
@@ -166,7 +167,7 @@ impl<'a> App<'a> {
}
}
impl<'a> Default for App<'a> {
impl Default for App<'_> {
fn default() -> Self {
App {
navigation_stack: Vec::new(),
@@ -259,7 +260,7 @@ impl AppConfig {
}
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[derive(Redact, Deserialize, Serialize, Clone)]
pub struct ServarrConfig {
#[serde(default, deserialize_with = "deserialize_optional_env_var")]
pub host: Option<String>,
@@ -268,6 +269,7 @@ pub struct ServarrConfig {
#[serde(default, deserialize_with = "deserialize_optional_env_var")]
pub uri: Option<String>,
#[serde(default, deserialize_with = "deserialize_env_var")]
#[redact]
pub api_token: String,
#[serde(default, deserialize_with = "deserialize_optional_env_var")]
pub ssl_cert_path: Option<String>,
+1 -1
View File
@@ -8,7 +8,7 @@ pub mod radarr_context_clues;
#[path = "radarr_tests.rs"]
mod radarr_tests;
impl<'a> App<'a> {
impl App<'_> {
pub(super) async fn dispatch_by_radarr_block(&mut self, active_radarr_block: &ActiveRadarrBlock) {
match active_radarr_block {
ActiveRadarrBlock::Blocklist => {
+1 -1
View File
@@ -11,7 +11,7 @@ pub mod sonarr_context_clues;
#[path = "sonarr_tests.rs"]
mod sonarr_tests;
impl<'a> App<'a> {
impl App<'_> {
pub(super) async fn dispatch_by_sonarr_block(&mut self, active_sonarr_block: &ActiveSonarrBlock) {
match active_sonarr_block {
ActiveSonarrBlock::Series => {
@@ -21,7 +21,7 @@ pub(super) struct BlocklistHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> BlocklistHandler<'a, 'b> {
impl BlocklistHandler<'_, '_> {
handle_table_events!(
self,
blocklist,
@@ -23,7 +23,7 @@ pub(super) struct CollectionDetailsHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> CollectionDetailsHandler<'a, 'b> {
impl CollectionDetailsHandler<'_, '_> {
handle_table_events!(
self,
collection_movies,
@@ -20,7 +20,7 @@ pub(super) struct EditCollectionHandler<'a, 'b> {
context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> EditCollectionHandler<'a, 'b> {
impl EditCollectionHandler<'_, '_> {
fn build_edit_collection_params(&mut self) -> EditCollectionParams {
let edit_collection_modal = self
.app
@@ -29,7 +29,7 @@ pub(super) struct CollectionsHandler<'a, 'b> {
context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> CollectionsHandler<'a, 'b> {
impl CollectionsHandler<'_, '_> {
handle_table_events!(
self,
collections,
@@ -20,7 +20,7 @@ pub(super) struct DownloadsHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> DownloadsHandler<'a, 'b> {
impl DownloadsHandler<'_, '_> {
handle_table_events!(
self,
downloads,
@@ -19,7 +19,7 @@ pub(super) struct EditIndexerHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> EditIndexerHandler<'a, 'b> {
impl EditIndexerHandler<'_, '_> {
fn build_edit_indexer_params(&mut self) -> EditIndexerParams {
let edit_indexer_modal = self
.app
@@ -20,7 +20,7 @@ pub(super) struct IndexerSettingsHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> IndexerSettingsHandler<'a, 'b> {
impl IndexerSettingsHandler<'_, '_> {
fn build_edit_indexer_settings_body(&mut self) -> IndexerSettings {
self
.app
+1 -1
View File
@@ -31,7 +31,7 @@ pub(super) struct IndexersHandler<'a, 'b> {
context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> IndexersHandler<'a, 'b> {
impl IndexersHandler<'_, '_> {
handle_table_events!(self, indexers, self.app.data.radarr_data.indexers, Indexer);
fn extract_indexer_id(&self) -> i64 {
@@ -17,7 +17,7 @@ pub(super) struct TestAllIndexersHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> TestAllIndexersHandler<'a, 'b> {
impl TestAllIndexersHandler<'_, '_> {
handle_table_events!(
self,
indexer_test_all_results,
@@ -24,7 +24,7 @@ pub(super) struct AddMovieHandler<'a, 'b> {
context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> AddMovieHandler<'a, 'b> {
impl AddMovieHandler<'_, '_> {
handle_table_events!(
self,
add_movie_search_results,
@@ -17,7 +17,7 @@ pub(super) struct DeleteMovieHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> DeleteMovieHandler<'a, 'b> {
impl DeleteMovieHandler<'_, '_> {
fn build_delete_movie_params(&mut self) -> DeleteMovieParams {
let id = self.app.data.radarr_data.movies.current_selection().id;
let delete_movie_files = self.app.data.radarr_data.delete_movie_files;
@@ -20,7 +20,7 @@ pub(super) struct EditMovieHandler<'a, 'b> {
context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> EditMovieHandler<'a, 'b> {
impl EditMovieHandler<'_, '_> {
fn build_edit_movie_params(&mut self) -> EditMovieParams {
let movie_id = self.app.data.radarr_data.movies.current_selection().id;
let edit_movie_modal = self
+1 -1
View File
@@ -34,7 +34,7 @@ pub(super) struct LibraryHandler<'a, 'b> {
context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> LibraryHandler<'a, 'b> {
impl LibraryHandler<'_, '_> {
handle_table_events!(self, movies, self.app.data.radarr_data.movies, Movie);
}
@@ -28,7 +28,7 @@ pub(super) struct MovieDetailsHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> MovieDetailsHandler<'a, 'b> {
impl MovieDetailsHandler<'_, '_> {
handle_table_events!(
self,
movie_releases,
@@ -21,7 +21,7 @@ pub(super) struct RootFoldersHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> RootFoldersHandler<'a, 'b> {
impl RootFoldersHandler<'_, '_> {
handle_table_events!(
self,
root_folders,
@@ -19,7 +19,7 @@ pub(super) struct SystemDetailsHandler<'a, 'b> {
_context: Option<ActiveRadarrBlock>,
}
impl<'a, 'b> SystemDetailsHandler<'a, 'b> {
impl SystemDetailsHandler<'_, '_> {
fn extract_task_name(&self) -> RadarrTaskName {
self
.app
@@ -21,7 +21,7 @@ pub(super) struct BlocklistHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> BlocklistHandler<'a, 'b> {
impl BlocklistHandler<'_, '_> {
handle_table_events!(
self,
blocklist,
@@ -20,7 +20,7 @@ pub(super) struct DownloadsHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> DownloadsHandler<'a, 'b> {
impl DownloadsHandler<'_, '_> {
handle_table_events!(
self,
downloads,
+1 -1
View File
@@ -21,7 +21,7 @@ pub(super) struct HistoryHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> HistoryHandler<'a, 'b> {
impl HistoryHandler<'_, '_> {
handle_table_events!(
self,
history,
@@ -19,7 +19,7 @@ pub(super) struct EditIndexerHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> EditIndexerHandler<'a, 'b> {
impl EditIndexerHandler<'_, '_> {
fn build_edit_indexer_params(&mut self) -> EditIndexerParams {
let edit_indexer_modal = self
.app
@@ -20,7 +20,7 @@ pub(super) struct IndexerSettingsHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> IndexerSettingsHandler<'a, 'b> {
impl IndexerSettingsHandler<'_, '_> {
fn build_edit_indexer_settings_params(&mut self) -> IndexerSettings {
self
.app
+1 -1
View File
@@ -31,7 +31,7 @@ pub(super) struct IndexersHandler<'a, 'b> {
context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> IndexersHandler<'a, 'b> {
impl IndexersHandler<'_, '_> {
handle_table_events!(self, indexers, self.app.data.sonarr_data.indexers, Indexer);
fn extract_indexer_id(&self) -> i64 {
@@ -17,7 +17,7 @@ pub(super) struct TestAllIndexersHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> TestAllIndexersHandler<'a, 'b> {
impl TestAllIndexersHandler<'_, '_> {
handle_table_events!(
self,
indexer_test_all_results,
@@ -22,7 +22,7 @@ pub(super) struct AddSeriesHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> AddSeriesHandler<'a, 'b> {
impl AddSeriesHandler<'_, '_> {
handle_table_events!(
self,
add_searched_series,
@@ -18,7 +18,7 @@ pub(super) struct DeleteSeriesHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> DeleteSeriesHandler<'a, 'b> {
impl DeleteSeriesHandler<'_, '_> {
fn build_delete_series_params(&mut self) -> DeleteSeriesParams {
let id = self.app.data.sonarr_data.series.current_selection().id;
let delete_series_files = self.app.data.sonarr_data.delete_series_files;
@@ -20,7 +20,7 @@ pub(super) struct EditSeriesHandler<'a, 'b> {
context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> EditSeriesHandler<'a, 'b> {
impl EditSeriesHandler<'_, '_> {
fn build_edit_series_params(&mut self) -> EditSeriesParams {
let edit_series_modal = self
.app
@@ -20,7 +20,7 @@ pub(super) struct EpisodeDetailsHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> EpisodeDetailsHandler<'a, 'b> {
impl EpisodeDetailsHandler<'_, '_> {
handle_table_events!(
self,
episode_history,
+1 -1
View File
@@ -44,7 +44,7 @@ pub(super) struct LibraryHandler<'a, 'b> {
context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> LibraryHandler<'a, 'b> {
impl LibraryHandler<'_, '_> {
handle_table_events!(self, series, self.app.data.sonarr_data.series, Series);
}
@@ -25,7 +25,7 @@ pub(super) struct SeasonDetailsHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> SeasonDetailsHandler<'a, 'b> {
impl SeasonDetailsHandler<'_, '_> {
handle_table_events!(
self,
episodes,
@@ -23,7 +23,7 @@ pub(super) struct SeriesDetailsHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> SeriesDetailsHandler<'a, 'b> {
impl SeriesDetailsHandler<'_, '_> {
handle_table_events!(self, season, self.app.data.sonarr_data.seasons, Season);
handle_table_events!(
self,
@@ -21,7 +21,7 @@ pub(super) struct RootFoldersHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> RootFoldersHandler<'a, 'b> {
impl RootFoldersHandler<'_, '_> {
handle_table_events!(
self,
root_folders,
@@ -19,7 +19,7 @@ pub(super) struct SystemDetailsHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> SystemDetailsHandler<'a, 'b> {
impl SystemDetailsHandler<'_, '_> {
fn extract_task_name(&self) -> SonarrTaskName {
self
.app
+1 -1
View File
@@ -89,7 +89,7 @@ mod tests {
fn handle_char_key_event(&mut self) {}
}
impl<'a, 'b> TableHandlerUnit<'a, 'b> {
impl TableHandlerUnit<'_, '_> {
handle_table_events!(self, movies, self.app.data.radarr_data.movies, Movie);
}
+3 -2
View File
@@ -1,4 +1,4 @@
#![warn(rust_2018_idioms)]
#![warn(rust_2021_compatibility)]
use anyhow::Result;
use std::panic::PanicHookInfo;
@@ -13,7 +13,7 @@ use crossterm::execute;
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use log::{error, warn};
use log::{debug, error, warn};
use network::NetworkTrait;
use ratatui::backend::CrosstermBackend;
use ratatui::Terminal;
@@ -93,6 +93,7 @@ async fn main() -> Result<()> {
confy::load("managarr", "config")?
};
let spinner_disabled = args.disable_spinner;
debug!("Managarr loaded using config: {config:?}");
config.validate();
let reqwest_client = build_network_client(&config);
let (sync_network_tx, sync_network_rx) = mpsc::channel(500);
+1 -1
View File
@@ -363,7 +363,7 @@ where
}
#[cfg(test)]
impl<'a, T> BlockSelectionState<'a, T>
impl<T> BlockSelectionState<'_, T>
where
T: Sized + Clone + Copy + Default,
{
@@ -71,7 +71,7 @@ pub struct RadarrData<'a> {
pub add_list_exclusion: bool,
}
impl<'a> RadarrData<'a> {
impl RadarrData<'_> {
pub fn reset_delete_movie_preferences(&mut self) {
self.delete_movie_files = false;
self.add_list_exclusion = false;
@@ -76,7 +76,7 @@ pub struct SonarrData<'a> {
pub version: String,
}
impl<'a> SonarrData<'a> {
impl SonarrData<'_> {
pub fn reset_delete_series_preferences(&mut self) {
self.delete_series_files = false;
self.add_list_exclusion = false;
+1 -1
View File
@@ -52,7 +52,7 @@ pub struct Network<'a, 'b> {
}
#[async_trait]
impl<'a, 'b> NetworkTrait for Network<'a, 'b> {
impl NetworkTrait for Network<'_, '_> {
async fn handle_network_event(&mut self, network_event: NetworkEvent) -> Result<Serdeable> {
let resp = match network_event {
NetworkEvent::Radarr(radarr_event) => self
+1 -1
View File
@@ -134,7 +134,7 @@ impl From<RadarrEvent> for NetworkEvent {
}
}
impl<'a, 'b> Network<'a, 'b> {
impl Network<'_, '_> {
pub async fn handle_radarr_event(
&mut self,
radarr_event: RadarrEvent,
+1 -1
View File
@@ -157,7 +157,7 @@ impl From<SonarrEvent> for NetworkEvent {
}
}
impl<'a, 'b> Network<'a, 'b> {
impl Network<'_, '_> {
pub async fn handle_sonarr_event(
&mut self,
sonarr_event: SonarrEvent,
+1 -1
View File
@@ -32,7 +32,7 @@ where
fn warning(self) -> T;
}
impl<'a, T, U> ManagarrStyle<'a, T> for U
impl<T, U> ManagarrStyle<'_, T> for U
where
U: Styled<Item = T>,
T: Default,
+2 -2
View File
@@ -20,7 +20,7 @@ pub struct Button<'a> {
is_selected: bool,
}
impl<'a> Button<'a> {
impl Button<'_> {
fn render_button_with_icon(self, area: Rect, buf: &mut Buffer) {
let [title_area, icon_area] = Layout::horizontal([
Constraint::Length(self.title.len() as u16),
@@ -69,7 +69,7 @@ impl<'a> Button<'a> {
}
}
impl<'a> Widget for Button<'a> {
impl Widget for Button<'_> {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
+1 -1
View File
@@ -49,7 +49,7 @@ impl<'a> Checkbox<'a> {
}
}
impl<'a> Widget for Checkbox<'a> {
impl Widget for Checkbox<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
self.render_checkbox(area, buf);
}
+2 -2
View File
@@ -26,7 +26,7 @@ pub struct ConfirmationPrompt<'a> {
yes_no_highlighted: bool,
}
impl<'a> ConfirmationPrompt<'a> {
impl ConfirmationPrompt<'_> {
pub fn new() -> Self {
Self {
title: "",
@@ -135,7 +135,7 @@ impl<'a> ConfirmationPrompt<'a> {
}
}
impl<'a> Widget for ConfirmationPrompt<'a> {
impl Widget for ConfirmationPrompt<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
if self.checkboxes.is_some() {
self.render_confirmation_prompt_with_checkboxes(area, buf);
+2 -2
View File
@@ -96,7 +96,7 @@ impl<'a> InputBox<'a> {
}
}
impl<'a> Widget for InputBox<'a> {
impl Widget for InputBox<'_> {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
@@ -105,7 +105,7 @@ impl<'a> Widget for InputBox<'a> {
}
}
impl<'a> WidgetRef for InputBox<'a> {
impl WidgetRef for InputBox<'_> {
fn render_ref(&self, area: Rect, buf: &mut Buffer) {
self.render_input_box(area, buf);
}
+1 -1
View File
@@ -53,7 +53,7 @@ impl<'a> InputBoxPopup<'a> {
}
}
impl<'a> WidgetRef for InputBoxPopup<'a> {
impl WidgetRef for InputBoxPopup<'_> {
fn render_ref(&self, area: Rect, buf: &mut Buffer) {
self.render_popup(area, buf);
}
+1 -1
View File
@@ -30,7 +30,7 @@ impl<'a> LoadingBlock<'a> {
}
}
impl<'a> Widget for LoadingBlock<'a> {
impl Widget for LoadingBlock<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
self.render_loading_block(area, buf);
}
+1 -1
View File
@@ -42,7 +42,7 @@ impl<'a> Message<'a> {
}
}
impl<'a> Widget for Message<'a> {
impl Widget for Message<'_> {
fn render(self, area: Rect, buf: &mut Buffer) {
self.render_message(area, buf);
}
+1 -1
View File
@@ -129,7 +129,7 @@ impl<'a, T: Widget> Popup<'a, T> {
}
}
impl<'a, T: Widget> Widget for Popup<'a, T> {
impl<T: Widget> Widget for Popup<'_, T> {
fn render(self, area: Rect, buf: &mut Buffer) {
self.render_popup(area, buf);
}