From 13c0d50ef861cca6539a4b26eb2abe3bcc53bef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Mon, 8 Nov 2021 21:17:26 +0700 Subject: [PATCH] Add port-test. --- README.md | 2 +- examples/port-test.rs | 26 +++++++++++++++++++++ src/lib.rs | 53 +++++++++++++++++++++++++++++++++---------- src/types/mod.rs | 1 + src/types/request.rs | 7 ++++++ src/types/response.rs | 7 ++++++ 6 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 examples/port-test.rs diff --git a/README.md b/README.md index ccf683b..bb22127 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ spec: https://github.com/transmission/transmission/blob/master/extras/rpc-spec.t - [X] session-get - [X] session-stats - [X] blocklist-update -- [ ] port-test +- [X] port-test - [ ] session-close - [ ] free-space diff --git a/examples/port-test.rs b/examples/port-test.rs new file mode 100644 index 0000000..fb33e45 --- /dev/null +++ b/examples/port-test.rs @@ -0,0 +1,26 @@ +extern crate transmission_rpc; + +use dotenv::dotenv; +use std::env; +use transmission_rpc::types::{BasicAuth, Result, RpcResponse, PortTest}; +use transmission_rpc::TransClient; + +#[tokio::main] +async fn main() -> Result<()> { + dotenv().ok(); + env_logger::init(); + let url = env::var("TURL")?; + let client; + if let (Ok(user), Ok(password)) = (env::var("TUSER"), env::var("TPWD")) { + client = TransClient::with_auth(&url, BasicAuth {user, password}); + } else { + client = TransClient::new(&url); + } + let response: Result> = client.port_test().await; + match response { + Ok(_) => println!("Yay!"), + Err(_) => panic!("Oh no!") + } + println!("Rpc response is ok: {}", response?.is_ok()); + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs index 4526cbd..e3fb8eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ use types::BasicAuth; use types::BlocklistUpdate; use types::SessionGet; use types::SessionStats; +use types::PortTest; use types::TorrentAction; use types::{Id, Torrent, TorrentGetField, Torrents}; use types::{Nothing, Result, RpcRequest, RpcResponse, RpcResponseArgument, TorrentRenamePath}; @@ -185,6 +186,42 @@ impl TransClient { self.call(RpcRequest::blocklist_update()).await } + /// Performs a port test call + /// + /// # Errors + /// + /// Any IO Error or Deserialization error + /// + /// # Example + /// + /// ``` + /// extern crate transmission_rpc; + /// + /// use std::env; + /// use dotenv::dotenv; + /// use transmission_rpc::TransClient; + /// use transmission_rpc::types::{Result, RpcResponse, BasicAuth, PortTest}; + /// + /// #[tokio::main] + /// async fn main() -> Result<()> { + /// dotenv().ok(); + /// env_logger::init(); + /// let url= env::var("TURL")?; + /// let basic_auth = BasicAuth{user: env::var("TUSER")?, password: env::var("TPWD")?}; + /// let client = TransClient::with_auth(&url, basic_auth); + /// let response: Result> = client.port_test().await; + /// match response { + /// Ok(_) => println!("Yay!"), + /// Err(_) => panic!("Oh no!") + /// } + /// println!("Rpc reqsponse is ok: {}", response?.is_ok()); + /// Ok(()) + /// } + /// ``` + pub async fn port_test(&self) -> Result> { + self.call(RpcRequest::port_test()).await + } + /// Performs a torrent get call /// fileds - if None then ALL fields /// ids - if None then All items @@ -464,18 +501,10 @@ impl TransClient { .expect("Unable to get the request body") .body_string()? ); - let http_resp: reqwest::Response = rq.send().await?; - match http_resp.error_for_status() { - Ok(http_resp) => { - let rpc_resp: RpcResponse = http_resp.json().await?; - info!("Response body: {:#?}", rpc_resp); - Ok(rpc_resp) - } - Err(err) => { - error!("{}", err.to_string()); - Err(err.into()) - } - } + let resp: reqwest::Response = rq.send().await?; + let rpc_response: RpcResponse = resp.json().await?; + info!("Response body: {:#?}", rpc_response); + Ok(rpc_response) } } diff --git a/src/types/mod.rs b/src/types/mod.rs index d7670c2..5d29ea7 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -23,6 +23,7 @@ pub(crate) use self::response::RpcResponseArgument; pub use self::response::SessionGet; pub use self::response::SessionStats; pub use self::response::BlocklistUpdate; +pub use self::response::PortTest; pub use self::response::Torrent; pub use self::response::TorrentAdded; pub use self::response::Torrents; diff --git a/src/types/request.rs b/src/types/request.rs index 37589d9..df7d198 100644 --- a/src/types/request.rs +++ b/src/types/request.rs @@ -30,6 +30,13 @@ impl RpcRequest { } } + pub fn port_test() -> RpcRequest { + RpcRequest { + method: String::from("port-test"), + arguments: None, + } + } + pub fn torrent_get(fields: Option>, ids: Option>) -> RpcRequest { let string_fields = fields .unwrap_or(TorrentGetField::all()) diff --git a/src/types/response.rs b/src/types/response.rs index a4b3587..8cf0857 100644 --- a/src/types/response.rs +++ b/src/types/response.rs @@ -53,6 +53,13 @@ pub struct BlocklistUpdate { } impl RpcResponseArgument for BlocklistUpdate {} +#[derive(Deserialize, Debug, Clone)] +pub struct PortTest { + #[serde(rename = "port-is-open")] + pub port_is_open: bool, +} +impl RpcResponseArgument for PortTest {} + #[derive(Deserialize, Debug, RustcEncodable, Clone)] pub struct Torrent { #[serde(rename = "addedDate")]