feat: Added initial Sonarr CLI support and the initial network handler setup for the TUI

This commit is contained in:
2024-11-10 21:23:55 -07:00
parent b6f5b9d08c
commit 60d61b9e31
28 changed files with 2419 additions and 761 deletions
+12 -6
View File
@@ -5,9 +5,10 @@ mod tests {
use tokio::sync::mpsc;
use crate::app::context_clues::{build_context_clue_string, SERVARR_CONTEXT_CLUES};
use crate::app::{App, Data, RadarrConfig, DEFAULT_ROUTE};
use crate::app::{App, Data, ServarrConfig, DEFAULT_ROUTE};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData};
use crate::models::{HorizontallyScrollableText, Route, TabRoute};
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData};
use crate::models::{HorizontallyScrollableText, TabRoute};
use crate::network::radarr_network::RadarrEvent;
use crate::network::NetworkEvent;
@@ -34,7 +35,7 @@ mod tests {
},
TabRoute {
title: "Sonarr",
route: Route::Sonarr,
route: ActiveSonarrBlock::Series.into(),
help: format!("{} ", build_context_clue_string(&SERVARR_CONTEXT_CLUES)),
contextual_help: None,
},
@@ -126,6 +127,10 @@ mod tests {
version: "test".to_owned(),
..RadarrData::default()
},
sonarr_data: SonarrData {
version: "test".to_owned(),
..SonarrData::default()
},
},
..App::default()
};
@@ -135,6 +140,7 @@ mod tests {
assert_eq!(app.tick_count, 0);
assert_eq!(app.error, HorizontallyScrollableText::default());
assert!(app.data.radarr_data.version.is_empty());
assert!(app.data.sonarr_data.version.is_empty());
}
#[test]
@@ -248,11 +254,11 @@ mod tests {
}
#[test]
fn test_radarr_config_default() {
let radarr_config = RadarrConfig::default();
fn test_servarr_config_default() {
let radarr_config = ServarrConfig::default();
assert_eq!(radarr_config.host, Some("localhost".to_string()));
assert_eq!(radarr_config.port, Some(7878));
assert_eq!(radarr_config.port, None);
assert_eq!(radarr_config.uri, None);
assert!(radarr_config.api_token.is_empty());
assert_eq!(radarr_config.ssl_cert_path, None);
+14 -14
View File
@@ -9,6 +9,7 @@ use tokio_util::sync::CancellationToken;
use crate::app::context_clues::{build_context_clue_string, SERVARR_CONTEXT_CLUES};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData};
use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData};
use crate::models::{HorizontallyScrollableText, Route, TabRoute, TabState};
use crate::network::NetworkEvent;
@@ -151,7 +152,7 @@ impl<'a> Default for App<'a> {
},
TabRoute {
title: "Sonarr",
route: Route::Sonarr,
route: ActiveSonarrBlock::Series.into(),
help: format!("{} ", build_context_clue_string(&SERVARR_CONTEXT_CLUES)),
contextual_help: None,
},
@@ -172,25 +173,24 @@ impl<'a> Default for App<'a> {
#[derive(Default)]
pub struct Data<'a> {
pub radarr_data: RadarrData<'a>,
}
pub trait ServarrConfig {
fn validate(&self);
pub sonarr_data: SonarrData,
}
#[derive(Debug, Deserialize, Serialize, Default)]
pub struct AppConfig {
pub radarr: RadarrConfig,
pub radarr: ServarrConfig,
pub sonarr: ServarrConfig,
}
impl ServarrConfig for AppConfig {
fn validate(&self) {
impl AppConfig {
pub fn validate(&self) {
self.radarr.validate();
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct RadarrConfig {
#[cfg_attr(test, derive(Clone))]
pub struct ServarrConfig {
pub host: Option<String>,
pub port: Option<u16>,
pub uri: Option<String>,
@@ -198,20 +198,20 @@ pub struct RadarrConfig {
pub ssl_cert_path: Option<String>,
}
impl ServarrConfig for RadarrConfig {
impl ServarrConfig {
fn validate(&self) {
if self.host.is_none() && self.uri.is_none() {
log_and_print_error("'host' or 'uri' is required for Radarr configuration".to_owned());
log_and_print_error("'host' or 'uri' is required for configuration".to_owned());
process::exit(1);
}
}
}
impl Default for RadarrConfig {
impl Default for ServarrConfig {
fn default() -> Self {
RadarrConfig {
ServarrConfig {
host: Some("localhost".to_string()),
port: Some(7878),
port: None,
uri: None,
api_token: "".to_string(),
ssl_cert_path: None,