use serde::Deserialize; #[derive(Deserialize, Debug)] pub struct RpcResponse { pub arguments: T, pub result: String, } impl RpcResponse { pub fn is_ok(&self) -> bool { self.result == "success" } } pub trait RpcResponseArgument {} #[derive(Deserialize, Debug, Clone)] pub struct SessionGet { #[serde(rename = "blocklist-enabled")] pub blocklist_enabled: bool, #[serde(rename = "download-dir")] pub download_dir: String, pub encryption: String, #[serde(rename = "rpc-version")] pub rpc_version: i32, #[serde(rename = "rpc-version-minimum")] pub rpc_version_minimum: i32, pub version: String, } impl RpcResponseArgument for SessionGet {} #[derive(Deserialize, Debug, Clone)] pub struct SessionStats { #[serde(rename = "torrentCount")] pub torrent_count: i32, #[serde(rename = "activeTorrentCount")] pub active_torrent_count: i32, #[serde(rename = "pausedTorrentCount")] pub paused_torrent_count: i32, #[serde(rename = "downloadSpeed")] pub download_speed: i64, #[serde(rename = "uploadSpeed")] pub upload_speed: i64, #[serde(rename = "current-stats")] pub current_stats: Stats, #[serde(rename = "cumulative-stats")] pub cumulative_stats: Stats, } impl RpcResponseArgument for SessionStats {} #[derive(Deserialize, Debug, Clone)] pub struct SessionClose {} impl RpcResponseArgument for SessionClose {} #[derive(Deserialize, Debug, Clone)] pub struct BlocklistUpdate { #[serde(rename = "blocklist-size")] pub blocklist_size: Option, } impl RpcResponseArgument for BlocklistUpdate {} #[derive(Deserialize, Debug, Clone)] pub struct FreeSpace { pub path: String, #[serde(rename = "size-bytes")] pub size_bytes: i64, } impl RpcResponseArgument for FreeSpace {} #[derive(Deserialize, Debug, Clone)] pub struct PortTest { #[serde(rename = "port-is-open")] pub port_is_open: bool, } impl RpcResponseArgument for PortTest {} #[derive(Deserialize, Debug, Clone)] pub struct Torrent { #[serde(rename = "addedDate")] pub added_date: Option, #[serde(rename = "doneDate")] pub done_date: Option, #[serde(rename = "downloadDir")] pub download_dir: Option, pub error: Option, #[serde(rename = "errorString")] pub error_string: Option, pub eta: Option, pub id: Option, #[serde(rename = "isFinished")] pub is_finished: Option, #[serde(rename = "isStalled")] pub is_stalled: Option, #[serde(rename = "leftUntilDone")] pub left_until_done: Option, #[serde(rename = "metadataPercentComplete")] pub metadata_percent_complete: Option, pub name: Option, #[serde(rename = "hashString")] pub hash_string: Option, #[serde(rename = "peersConnected")] pub peers_connected: Option, #[serde(rename = "peersGettingFromUs")] pub peers_getting_from_us: Option, #[serde(rename = "peersSendingToUs")] pub peers_sending_to_us: Option, #[serde(rename = "percentDone")] pub percent_done: Option, #[serde(rename = "rateDownload")] pub rate_download: Option, #[serde(rename = "rateUpload")] pub rate_upload: Option, #[serde(rename = "recheckProgress")] pub recheck_progress: Option, #[serde(rename = "seedRatioLimit")] pub seed_ratio_limit: Option, #[serde(rename = "sizeWhenDone")] pub size_when_done: Option, pub status: Option, #[serde(rename = "totalSize")] pub total_size: Option, pub trackers: Option>, #[serde(rename = "uploadRatio")] pub upload_ratio: Option, #[serde(rename = "uploadedEver")] pub uploaded_ever: Option, pub files: Option>, /// for each file in files, whether or not they will be downloaded (0 or 1) pub wanted: Option>, /// for each file in files, their download priority (low:-1,normal:0,high:1) pub priorities: Option>, #[serde(rename = "fileStats")] pub file_stats: Option>, } #[derive(Deserialize, Debug, Clone)] pub struct Stats { #[serde(rename = "filesAdded")] pub files_added: i32, #[serde(rename = "downloadedBytes")] pub downloaded_bytes: i64, #[serde(rename = "uploadedBytes")] pub uploaded_bytes: i64, #[serde(rename = "secondsActive")] pub seconds_active: i64, #[serde(rename = "sessionCount")] pub session_count: Option } #[derive(Deserialize, Debug)] pub struct Torrents { pub torrents: Vec, } impl RpcResponseArgument for Torrents {} #[derive(Deserialize, Debug, Clone)] pub struct Trackers { pub id: i32, pub announce: String, } #[derive(Deserialize, Debug, Clone)] pub struct File { pub length: i64, #[serde(rename = "bytesCompleted")] pub bytes_completed: i64, pub name: String, } #[derive(Deserialize, Debug, Clone)] pub struct FileStat { #[serde(rename = "bytesCompleted")] pub bytes_completed: i64, pub wanted: bool, /// low: -1, normal: 0, high: 1 pub priority: i8, } #[derive(Deserialize, Debug)] pub struct Nothing {} impl RpcResponseArgument for Nothing {} #[derive(Deserialize, Debug)] #[serde(rename_all="kebab-case")] pub enum TorrentAddedOrDuplicate { TorrentDuplicate(Torrent), TorrentAdded(Torrent), } impl RpcResponseArgument for TorrentAddedOrDuplicate {} #[derive(Deserialize, Debug)] pub struct TorrentRenamePath{ pub path: Option, pub name: Option, pub id: Option, } impl RpcResponseArgument for TorrentRenamePath {}