use std::{ net::{Ipv4Addr, SocketAddr, SocketAddrV4}, path::PathBuf, time::Duration, }; use librqbit::{dht::PersistentDht, Session}; use serde::{Deserialize, Serialize}; use serde_with::serde_as; #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfigDht { pub disable: bool, pub disable_persistence: bool, pub persistence_filename: PathBuf, } impl Default for RqbitDesktopConfigDht { fn default() -> Self { Self { disable: false, disable_persistence: false, persistence_filename: PersistentDht::default_persistence_filename().unwrap(), } } } #[derive(Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfigTcpListen { pub disable: bool, pub min_port: u16, pub max_port: u16, } impl Default for RqbitDesktopConfigTcpListen { fn default() -> Self { Self { disable: false, // TODO: use consts from librqbit min_port: 4240, max_port: 4260, } } } #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfigPersistence { pub disable: bool, pub filename: PathBuf, } impl Default for RqbitDesktopConfigPersistence { fn default() -> Self { Self { disable: false, filename: Session::default_persistence_filename().unwrap(), } } } #[serde_as] #[derive(Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfigPeerOpts { #[serde_as(as = "serde_with::DurationSeconds")] pub connect_timeout: Duration, #[serde_as(as = "serde_with::DurationSeconds")] pub read_write_timeout: Duration, } impl Default for RqbitDesktopConfigPeerOpts { fn default() -> Self { Self { connect_timeout: Duration::from_secs(2), read_write_timeout: Duration::from_secs(10), } } } #[serde_as] #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfigHttpApi { pub disable: bool, pub listen_addr: SocketAddr, pub read_only: bool, } impl Default for RqbitDesktopConfigHttpApi { fn default() -> Self { Self { disable: Default::default(), listen_addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 3030)), read_only: false, } } } #[derive(Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfigUpnp { pub disable: bool, } #[derive(Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RqbitDesktopConfig { pub default_download_location: PathBuf, pub dht: RqbitDesktopConfigDht, pub tcp_listen: RqbitDesktopConfigTcpListen, pub upnp: RqbitDesktopConfigUpnp, pub persistence: RqbitDesktopConfigPersistence, pub peer_opts: RqbitDesktopConfigPeerOpts, pub http_api: RqbitDesktopConfigHttpApi, } impl Default for RqbitDesktopConfig { fn default() -> Self { let download_folder = directories::UserDirs::new() .expect("directories::UserDirs::new()") .download_dir() .expect("download_dir()") .to_path_buf(); Self { default_download_location: download_folder, dht: Default::default(), tcp_listen: Default::default(), upnp: Default::default(), persistence: Default::default(), peer_opts: Default::default(), http_api: Default::default(), } } }