From e71bc1c6650b3dd2181e56fbc829dd974bf01b47 Mon Sep 17 00:00:00 2001 From: Aleksei Fedotov Date: Sun, 3 Jul 2022 21:09:22 +0200 Subject: [PATCH] Handle adding duplicated torrent. Starting from Transmission 2.80 (rpc-version-semver 5.1.0, rpc-version: 15) 'torrent-add' could return 'torrent-duplicated' from torrent-add if the torrent already exists. Replace 'TorrentAdded' with 'TorrentAddedOrDuplicate'. --- examples/torrent-add.rs | 4 ++-- src/lib.rs | 6 +++--- src/types/mod.rs | 2 +- src/types/response.rs | 9 +++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/torrent-add.rs b/examples/torrent-add.rs index 6a5f5a6..076a89e 100644 --- a/examples/torrent-add.rs +++ b/examples/torrent-add.rs @@ -3,7 +3,7 @@ extern crate transmission_rpc; use dotenv::dotenv; use std::env; use transmission_rpc::types::{BasicAuth, Result, RpcResponse}; -use transmission_rpc::types::{TorrentAddArgs, TorrentAdded}; +use transmission_rpc::types::{TorrentAddArgs, TorrentAddedOrDuplicate}; use transmission_rpc::TransClient; #[tokio::main] @@ -21,7 +21,7 @@ async fn main() -> Result<()> { filename: Some("https://releases.ubuntu.com/20.04/ubuntu-20.04.2.0-desktop-amd64.iso.torrent".to_string()), ..TorrentAddArgs::default() }; - let res: RpcResponse = client.torrent_add(add).await?; + let res: RpcResponse = client.torrent_add(add).await?; println!("Add result: {:?}", &res.is_ok()); println!("response: {:?}", &res); diff --git a/src/lib.rs b/src/lib.rs index af917e9..784dbf5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,7 +19,7 @@ use types::FreeSpace; use types::TorrentAction; use types::{Id, Torrent, TorrentGetField, Torrents}; use types::{Nothing, Result, RpcRequest, RpcResponse, RpcResponseArgument, TorrentRenamePath}; -use types::{TorrentAddArgs, TorrentAdded}; +use types::{TorrentAddArgs, TorrentAddedOrDuplicate}; const MAX_RETRIES: usize = 5; @@ -527,7 +527,7 @@ impl TransClient { /// use dotenv::dotenv; /// use transmission_rpc::TransClient; /// use transmission_rpc::types::{Result, RpcResponse, BasicAuth}; - /// use transmission_rpc::types::{TorrentAddArgs, TorrentAdded}; + /// use transmission_rpc::types::{TorrentAddArgs, TorrentAddedOrDuplicate}; /// /// #[tokio::main] /// async fn main() -> Result<()> { @@ -540,7 +540,7 @@ impl TransClient { /// filename: Some("https://releases.ubuntu.com/20.04/ubuntu-20.04-desktop-amd64.iso.torrent".to_string()), /// ..TorrentAddArgs::default() /// }; - /// let res: RpcResponse = client.torrent_add(add).await?; + /// let res: RpcResponse = client.torrent_add(add).await?; /// println!("Add result: {:?}", &res.is_ok()); /// println!("response: {:?}", &res); /// diff --git a/src/types/mod.rs b/src/types/mod.rs index e2a3e32..5b26388 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -27,6 +27,6 @@ pub use self::response::BlocklistUpdate; pub use self::response::PortTest; pub use self::response::FreeSpace; pub use self::response::Torrent; -pub use self::response::TorrentAdded; +pub use self::response::TorrentAddedOrDuplicate; pub use self::response::Torrents; pub use self::response::TorrentRenamePath; diff --git a/src/types/response.rs b/src/types/response.rs index 15e04ce..41af839 100644 --- a/src/types/response.rs +++ b/src/types/response.rs @@ -179,11 +179,12 @@ pub struct Nothing {} impl RpcResponseArgument for Nothing {} #[derive(Deserialize, Debug)] -pub struct TorrentAdded { - #[serde(rename = "torrent-added")] - pub torrent_added: Option, +#[serde(rename_all="kebab-case")] +pub enum TorrentAddedOrDuplicate { + TorrentDuplicate(Torrent), + TorrentAdded(Torrent), } -impl RpcResponseArgument for TorrentAdded {} +impl RpcResponseArgument for TorrentAddedOrDuplicate {} #[derive(Deserialize, Debug)] pub struct TorrentRenamePath{