use crate::config::{OptionCategory, OptionDef, OptionType, OptionValue};
#[allow(dead_code)] pub(super) trait RegisterOptions {
fn register_general_options(&mut self);
fn register_http_ftp_options(&mut self);
fn register_bt_options(&mut self);
fn register_rpc_options(&mut self);
fn register_advanced_options(&mut self);
fn register_all_options(&mut self) {
self.register_general_options();
self.register_http_ftp_options();
self.register_bt_options();
self.register_rpc_options();
self.register_advanced_options();
}
}
impl super::OptionRegistry {
pub fn register_general_options(&mut self) {
self.register(OptionDef {
name: "dir".into(),
opt_type: OptionType::Path,
short_name: Some('d'),
default_value: OptionValue::Str(".".into()),
description: "Save directory".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "out".into(),
opt_type: OptionType::String,
short_name: Some('o'),
description: "Output filename".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "log".into(),
opt_type: OptionType::Path,
short_name: Some('l'),
default_value: OptionValue::Str("-".into()),
description: "Log file path".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "log-level".into(),
opt_type: OptionType::Enum,
short_name: Some('L'),
default_value: OptionValue::Str("info".into()),
description: "Log level (debug/info/notice/warn/error)".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "console-log-level".into(),
opt_type: OptionType::Enum,
default_value: OptionValue::Str("notice".into()),
description: "Console log level".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "summary-interval".into(),
opt_type: OptionType::Integer,
short_name: Some('S'),
default_value: OptionValue::Int(60),
min: Some(0),
max: Some(3600),
description: "Progress summary interval in seconds".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "conf-path".into(),
opt_type: OptionType::Path,
description: "Configuration file path".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "input-file".into(),
opt_type: OptionType::Path,
short_name: Some('i'),
description: "URI input file".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "save-session".into(),
opt_type: OptionType::Path,
description: "Session save file".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "save-session-interval".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(0),
description: "Auto-save session interval (0=disabled)".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "auto-save-interval".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(60),
min: Some(0),
max: Some(600),
description: "Auto-save interval".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "enable-color".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Enable colored output".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "quiet".into(),
opt_type: OptionType::Boolean,
short_name: Some('q'),
default_value: OptionValue::Bool(false),
description: "Quiet mode".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "dry-run".into(),
opt_type: OptionType::Boolean,
short_name: Some('n'),
default_value: OptionValue::Bool(false),
description: "Dry run (check only, no download)".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "daemon".into(),
opt_type: OptionType::Boolean,
short_name: Some('D'),
default_value: OptionValue::Bool(false),
description: "Run as a background daemon (detached process)".into(),
category: OptionCategory::General,
..Default::default()
});
self.register(OptionDef {
name: "pid-file".into(),
opt_type: OptionType::Path,
description: "Path to PID file for daemon process management".into(),
category: OptionCategory::General,
..Default::default()
});
}
}
impl super::OptionRegistry {
pub fn register_http_ftp_options(&mut self) {
self.register(OptionDef {
name: "all-proxy".into(),
opt_type: OptionType::String,
short_name: Some('p'),
description: "Global proxy URL".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "http-proxy".into(),
opt_type: OptionType::String,
short_name: Some('P'),
description: "HTTP proxy URL".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "https-proxy".into(),
opt_type: OptionType::String,
short_name: Some('y'),
description: "HTTPS proxy URL".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "ftp-proxy".into(),
opt_type: OptionType::String,
short_name: Some('F'),
description: "FTP proxy URL".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "no-proxy".into(),
opt_type: OptionType::List,
short_name: Some('N'),
description: "Proxy exclusion list (comma-separated domains)".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "user-agent".into(),
opt_type: OptionType::String,
short_name: Some('U'),
default_value: OptionValue::Str("aria2/1.37.0-Rust".into()),
description: "User-Agent header".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "referer".into(),
opt_type: OptionType::String,
short_name: Some('R'),
description: "Referer header".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "header".into(),
opt_type: OptionType::List,
short_name: Some('H'),
description: "Custom headers (Header:Value pairs)".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "load-cookies".into(),
opt_type: OptionType::Path,
short_name: Some('C'),
description: "Cookie file to load".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "save-cookies".into(),
opt_type: OptionType::Path,
short_name: Some('V'),
description: "Cookie file to save".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "connect-timeout".into(),
opt_type: OptionType::Integer,
short_name: Some('T'),
default_value: OptionValue::Int(60),
min: Some(1),
max: Some(600),
description: "Connect timeout in seconds".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "timeout".into(),
opt_type: OptionType::Integer,
short_name: Some('t'),
default_value: OptionValue::Int(60),
min: Some(1),
max: Some(600),
description: "I/O timeout in seconds".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "max-tries".into(),
opt_type: OptionType::Integer,
short_name: Some('m'),
default_value: OptionValue::Int(5),
min: Some(0),
max: Some(100),
description: "Max retry attempts".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "retry-wait".into(),
opt_type: OptionType::Integer,
short_name: Some('w'),
default_value: OptionValue::Int(0),
min: Some(0),
max: Some(3600),
description: "Retry wait time in seconds".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "split".into(),
opt_type: OptionType::Integer,
short_name: Some('s'),
default_value: OptionValue::Int(5),
min: Some(1),
max: Some(16),
description: "Connections per download".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "min-split-size".into(),
opt_type: OptionType::Size,
short_name: Some('k'),
default_value: OptionValue::Int((20 * 1024 * 1024) as i64),
description: "Min split size".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "max-connection-per-server".into(),
opt_type: OptionType::Integer,
short_name: Some('x'),
default_value: OptionValue::Int(1),
min: Some(1),
max: Some(16),
description: "Max connections per server".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "check-certificate".into(),
opt_type: OptionType::Boolean,
short_name: Some('b'),
default_value: OptionValue::Bool(true),
description: "Verify SSL certificate".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "ca-certificate".into(),
opt_type: OptionType::Path,
short_name: Some('E'),
description: "CA certificate file".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "allow-overwrite".into(),
opt_type: OptionType::Boolean,
short_name: Some('O'),
default_value: OptionValue::Bool(false),
description: "Allow overwriting existing files".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "auto-file-renaming".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Auto rename conflicting files".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "continue".into(),
opt_type: OptionType::Boolean,
short_name: Some('c'),
default_value: OptionValue::Bool(true),
description: "Resume partial downloads".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
self.register(OptionDef {
name: "remote-time".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Use remote file timestamp".into(),
category: OptionCategory::HttpFtp,
..Default::default()
});
}
}
impl super::OptionRegistry {
pub fn register_bt_options(&mut self) {
self.register(OptionDef {
name: "seed-time".into(),
opt_type: OptionType::Float,
short_name: Some('G'),
default_value: OptionValue::Float(0.0),
description: "Seeding time in minutes (0=infinite)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "seed-ratio".into(),
opt_type: OptionType::Float,
short_name: Some('g'),
default_value: OptionValue::Float(1.0),
description: "Share ratio threshold".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-max-peers".into(),
opt_type: OptionType::Integer,
short_name: Some('B'),
default_value: OptionValue::Int(55),
min: Some(0),
max: Some(512),
description: "Max peers per torrent".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-request-peer-speed-limit".into(),
opt_type: OptionType::Size,
default_value: OptionValue::Int((50 * 1024) as i64),
description: "Min peer speed to stay connected".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-max-open-files".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(100),
min: Some(10),
max: Some(4096),
description: "Max open files for BT".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-seed-unverified".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(false),
description: "Seed without verifying hash".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-save-metadata".into(),
opt_type: OptionType::Boolean,
short_name: Some('M'),
default_value: OptionValue::Bool(false),
description: "Save metadata as .torrent file".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-force-encryption".into(),
opt_type: OptionType::Boolean,
short_name: Some('X'),
default_value: OptionValue::Bool(false),
description: "Force BT encryption".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-min-crypto-level".into(),
opt_type: OptionType::Enum,
default_value: OptionValue::Str("plain".into()),
description: "Min crypto level (plain/arc4)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-enable-lpd".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Enable Local Peer Discovery".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "enable-lpd".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Enable Local Peer Discovery (alias for bt-enable-lpd)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "lpd-listen-port".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(6771),
min: Some(1024),
max: Some(65535),
description: "UDP port for Local Peer Discovery".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-enable-web-seed".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Enable web seed (HTTP/FTP seeding)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "enable-dht".into(),
opt_type: OptionType::Boolean,
short_name: Some('D'),
default_value: OptionValue::Bool(true),
description: "Enable DHT".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "dht-listen-port".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(6881),
min: Some(1024),
max: Some(65535),
description: "DHT listen port".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "dht-entry-point".into(),
opt_type: OptionType::List,
description: "DHT bootstrap nodes (host:port format, comma-separated)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "dht-file-path".into(),
opt_type: OptionType::Path,
description: "Path to DHT routing table file for persistence".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "dht-message-path".into(),
opt_type: OptionType::Path,
description: "DHT message cache path (deprecated, use dht-file-path instead)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "enable-peer-exchange".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(true),
description: "Enable PEX".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "follow-torrent".into(),
opt_type: OptionType::Enum,
short_name: Some('M'),
default_value: OptionValue::Str("true".into()),
description: "Auto-handle .torrent (true/false/mem)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "on-bt-download-complete".into(),
opt_type: OptionType::String,
description: "Command on BT download complete".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "on-bt-download-error".into(),
opt_type: OptionType::String,
description: "Command on BT download error".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "listen-port".into(),
opt_type: OptionType::String,
short_name: Some('h'),
default_value: OptionValue::Str("6881-6999".into()),
description: "Listening port range".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "bt-prioritize-piece".into(),
opt_type: OptionType::String,
default_value: OptionValue::Str("rarest".into()),
description: "Piece selection priority mode: 'rarest' (default), 'head' (sequential from start), 'tail' (sequential from end)".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "enable-utp".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(false),
description: "Enable uTP (UDP Transport Protocol, BEP 29). Experimental feature not in original aria2. Default: false".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
self.register(OptionDef {
name: "utp-listen-port".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(0),
min: Some(0),
max: Some(65535),
description: "UDP port for uTP connections. 0 = auto-assign. Experimental feature not in original aria2".into(),
category: OptionCategory::BitTorrent,
..Default::default()
});
}
}
impl super::OptionRegistry {
pub fn register_rpc_options(&mut self) {
self.register(OptionDef {
name: "enable-rpc".into(),
opt_type: OptionType::Boolean,
short_name: Some('e'),
default_value: OptionValue::Bool(false),
description: "Enable JSON-RPC/XML-RPC server".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-listen-all".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(false),
description: "Listen on all network interfaces".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-listen-port".into(),
opt_type: OptionType::Integer,
short_name: Some('r'),
default_value: OptionValue::Int(6800),
min: Some(1024),
max: Some(65535),
description: "RPC server port".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-listen-address".into(),
opt_type: OptionType::String,
default_value: OptionValue::Str("127.0.0.1".into()),
description: "RPC server bind address".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-secret".into(),
opt_type: OptionType::String,
short_name: Some('I'),
description: "RPC secret token for authorization".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-user".into(),
opt_type: OptionType::String,
description: "RPC Basic Auth username".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-passwd".into(),
opt_type: OptionType::String,
description: "RPC Basic Auth password".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-allow-origin".into(),
opt_type: OptionType::String,
description: "CORS Allow-Origin value".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-cors-domain".into(),
opt_type: OptionType::String,
default_value: OptionValue::Str("*".into()),
description: "CORS allowed domains for RPC (comma-separated, * for all)".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-secure".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(false),
description: "Enable HTTPS for RPC server".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-certificate".into(),
opt_type: OptionType::Path,
description: "Path to TLS certificate file (PEM format)".into(),
category: OptionCategory::Rpc,
..Default::default()
});
self.register(OptionDef {
name: "rpc-private-key".into(),
opt_type: OptionType::Path,
description: "Path to TLS private key file (PEM format)".into(),
category: OptionCategory::Rpc,
..Default::default()
});
}
}
impl super::OptionRegistry {
pub fn register_advanced_options(&mut self) {
self.register(OptionDef {
name: "file-allocation".into(),
opt_type: OptionType::Enum,
short_name: Some('f'),
default_value: OptionValue::Str("falloc".into()),
description: "File allocation method (none/prealloc/falloc/trunc/mmap)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "secure-falloc".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(false),
description: "Zero-fill allocated space after fallocate on platforms that don't zero-fill (macOS, Windows). Prevents exposure of residual disk data at a performance cost.".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "mmap-threshold".into(),
opt_type: OptionType::Size,
default_value: OptionValue::Int(256 * 1024 * 1024), description:
"File size threshold for mmap writes when file-allocation=mmap (default 256 MiB)"
.into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "max-concurrent-downloads".into(),
opt_type: OptionType::Integer,
short_name: Some('j'),
default_value: OptionValue::Int(5),
min: Some(1),
max: Some(256),
description: "Max concurrent downloads".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "max-overall-download-limit".into(),
opt_type: OptionType::Size,
short_name: Some('A'),
default_value: OptionValue::Int(0),
description: "Overall download speed limit (0=unlimited)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "max-download-limit".into(),
opt_type: OptionType::Size,
short_name: Some('Q'),
default_value: OptionValue::Int(0),
description: "Per-task download limit (0=unlimited)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "max-overall-upload-limit".into(),
opt_type: OptionType::Size,
short_name: Some('W'),
default_value: OptionValue::Int(0),
description: "Overall upload speed limit (0=unlimited)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "max-upload-limit".into(),
opt_type: OptionType::Size,
short_name: Some('K'),
default_value: OptionValue::Int(0),
description: "Per-task upload limit (0=unlimited)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "piece-length".into(),
opt_type: OptionType::Size,
short_name: Some('Y'),
default_value: OptionValue::Int((1024 * 1024) as i64),
description: "BT piece length".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "disk-cache".into(),
opt_type: OptionType::Size,
short_name: Some('Z'),
default_value: OptionValue::Int(0),
description: "Disk cache size (0=disabled)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "stop".into(),
opt_type: OptionType::Integer,
short_name: Some('z'),
default_value: OptionValue::Int(0),
min: Some(0),
max: Some(86400),
description: "Stop after N seconds of completion (0=never)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "force-save".into(),
opt_type: OptionType::Boolean,
default_value: OptionValue::Bool(false),
description: "Force save state on every change".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "server-stat-file".into(),
opt_type: OptionType::Path,
description: "Path to save/load server performance statistics".into(),
category: OptionCategory::Advanced,
..Default::default()
});
self.register(OptionDef {
name: "save-server-stat-interval".into(),
opt_type: OptionType::Integer,
default_value: OptionValue::Int(0),
min: Some(0),
max: Some(86400),
description: "Auto-save interval for server stats in seconds (0 = disabled)".into(),
category: OptionCategory::Advanced,
..Default::default()
});
}
}