1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
use app::App;
use auth::Auth;
use config::Config;
use opts::Opts;
use serde::Deserialize;
use std::collections::HashMap;
use target::Target;
use trigger::Trigger;
use webhook::Webhook;
/// App-specific settings
///
/// Example:
///
/// ```yml
/// app:
/// hostname: 0.0.0.0
/// port: 1234
/// database_url: sqlite://autopulse.db
/// log_level: debug
/// ```
pub mod app;
/// Authentication settings
///
/// Example:
///
/// ```yml
/// auth:
/// username: terry
/// password: yogurt
/// ```
pub mod auth;
/// Global settings
///
/// Example:
///
/// ```yml
/// opts:
/// check_path: true
/// max_retries: 10
/// default_timer_wait: 300
/// cleanup_days: 7
/// ```
pub mod opts;
/// Rewrite structure for triggers
///
/// Example:
///
/// ```yml
/// triggers:
/// sonarr:
/// type: sonarr
/// rewrite:
/// from: /tv
/// to: /media/tv
pub mod rewrite;
/// Timer structure for triggers
///
/// Example:
///
/// ```yml
/// triggers:
/// sonarr:
/// type: sonarr
/// timer:
/// wait: 300 # wait 5 minutes before processing
/// ```
pub mod timer;
/// Trigger structure
///
/// [Triggers](crate::service::triggers) for the service
pub mod trigger;
/// Target structure
///
/// [Targets](crate::service::targets) for the service
pub mod target;
/// Webhook structure
///
/// [Webhooks](crate::service::webhooks) for the service
pub mod webhook;
/// autopulse settings
#[derive(Deserialize, Clone)]
pub struct Settings {
#[serde(default)]
pub app: App,
#[serde(default)]
pub auth: Auth,
#[serde(default)]
pub opts: Opts,
#[serde(default)]
pub triggers: HashMap<String, Trigger>,
#[serde(default)]
pub targets: HashMap<String, Target>,
#[serde(default)]
pub webhooks: HashMap<String, Webhook>,
}
impl Settings {
pub fn get_settings(optional_config_file: Option<String>) -> anyhow::Result<Self> {
let mut settings = Config::builder()
.add_source(config::File::with_name("config").required(false))
.add_source(config::Environment::with_prefix("AUTOPULSE").separator("__"));
if let Some(file_loc) = optional_config_file {
settings = settings.add_source(config::File::with_name(&file_loc));
}
let settings = settings.build()?;
settings
.try_deserialize::<Self>()
.map_err(|e| anyhow::anyhow!(e))
}
}