Feat: Fügt Config-Modul für die Anwendungskonfiguration hinzu.

This commit is contained in:
2025-08-20 16:10:28 +02:00
parent ba9f01b3cb
commit 2991370051
2 changed files with 132 additions and 0 deletions

View File

@@ -6,3 +6,5 @@ authors = ['DragonSlayer_14']
[dependencies] [dependencies]
time = { version="0.3.41", features = ["formatting", "macros", "local-offset"] } time = { version="0.3.41", features = ["formatting", "macros", "local-offset"] }
serde = { version="1.0.219", features = ["derive"] }
confy = "1.0.0"

130
src/config.rs Normal file
View File

@@ -0,0 +1,130 @@
//! Modul für die Konfigurationsverwaltung der Anwendung.
//!
//! Dieses Modul stellt die Funktionalität zum Laden, Speichern und Verwalten
//! der Anwendungskonfiguration bereit. Die Konfiguration wird in einer Datei gespeichert
//! und beim Programmstart automatisch geladen.
use crate::program;
use serde::{Deserialize, Serialize};
use std::sync::OnceLock;
/// Hauptkonfigurationsstruktur der Anwendung.
///
/// Enthält alle Konfigurationseinstellungen, aufgeteilt in verschiedene Bereiche.
#[derive(Serialize, Deserialize, Clone)]
pub struct AppConfig {
/// Allgemeine Einstellungen
pub general: General,
/// Lokale Einbindungseinstellungen
pub local: Local,
/// Remote-Einbindungseinstellungen
pub remote: Remote,
}
impl Default for AppConfig {
fn default() -> Self {
Self {
general: General::default(),
local: Local::default(),
remote: Remote::default(),
}
}
}
/// Allgemeine Konfigurationseinstellungen.
#[derive(Serialize, Deserialize, Clone)]
pub struct General {
/// Log-Level für die Anwendung
pub log_level: String,
/// Pfad zum Einhängepunkt
pub mount_path: String,
}
impl Default for General {
fn default() -> Self {
Self {
log_level: "info".to_string(),
mount_path: get_default_mount_path(),
}
}
}
/// Konfiguration für lokale Einbindungen.
#[derive(Serialize, Deserialize, Clone)]
pub struct Local {
/// Typ der lokalen Einbindung (z.B. "nfs")
pub local_mount_type: String,
/// Pfad zur lokalen Einbindung
pub local_mount_path: String,
/// MAC-Adresse des lokalen Geräts
pub local_device_mac: String,
}
impl Default for Local {
fn default() -> Self {
Self {
local_mount_type: "nfs".to_string(),
local_mount_path: "".to_string(),
local_device_mac: "".to_string(),
}
}
}
/// Konfiguration für Remote-Einbindungen.
#[derive(Serialize, Deserialize, Clone)]
pub struct Remote {
/// Typ der Remote-Einbindung (z.B. "webdav")
pub remote_mount_type: String,
/// Pfad zur Remote-Einbindung
pub remote_mount_path: String,
/// Benutzername für Remote-Zugriff
pub remote_username: String,
/// Passwort für Remote-Zugriff
pub remote_password: String,
}
impl Default for Remote {
fn default() -> Self {
Self {
remote_mount_type: "webdav".to_string(),
remote_mount_path: "".to_string(),
remote_username: "".to_string(),
remote_password: "".to_string(),
}
}
}
/// Ermittelt den Standard-Einhängepunkt basierend auf dem Betriebssystem.
fn get_default_mount_path() -> String {
#[cfg(not(any(target_os = "windows")))]
{
"/media/smart_mount".to_string()
}
#[cfg(any(target_os = "windows"))]
{
"".to_string() //TODO Was kommt hier hin????
}
}
static CONFIG_NAME: &str = "config";
static CONFIG: OnceLock<AppConfig> = OnceLock::new();
/// Gibt die aktuelle Konfiguration zurück.
///
/// Lädt die Konfiguration beim ersten Aufruf und speichert sie zwischen.
/// Nachfolgende Aufrufe geben die gespeicherte Konfiguration zurück.
pub fn get_config() -> &'static AppConfig {
CONFIG.get_or_init(|| {
load_config()
})
}
/// Lädt die Konfiguration aus der Konfigurationsdatei.
fn load_config() -> AppConfig {
confy::load(&*program::program_name(), CONFIG_NAME).unwrap_or_default()
}
/// Speichert die übergebene Konfiguration in der Konfigurationsdatei.
fn save_config(config: AppConfig) {
confy::store(&*program::program_name(), CONFIG_NAME, config).unwrap();
}