From c3f219769452ce353abf548b142f3f1cb04de0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Mon, 8 Nov 2021 22:30:17 +0700 Subject: [PATCH] Add free-space. --- README.md | 2 +- examples/free-space.rs | 27 +++++++++++++++++++++++++++ src/lib.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/types/mod.rs | 1 + src/types/request.rs | 13 +++++++++++++ src/types/response.rs | 8 ++++++++ 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 examples/free-space.rs diff --git a/README.md b/README.md index bb22127..e6ddb4f 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,6 @@ spec: https://github.com/transmission/transmission/blob/master/extras/rpc-spec.t - [X] blocklist-update - [X] port-test - [ ] session-close -- [ ] free-space +- [X] free-space Support the project: [![Donate button](https://www.paypalobjects.com/en_US/DK/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=H337RKJSC4YG4&source=url) diff --git a/examples/free-space.rs b/examples/free-space.rs new file mode 100644 index 0000000..f6188c5 --- /dev/null +++ b/examples/free-space.rs @@ -0,0 +1,27 @@ +extern crate transmission_rpc; + +use dotenv::dotenv; +use std::env; +use transmission_rpc::types::{BasicAuth, Result, RpcResponse, FreeSpace}; +use transmission_rpc::TransClient; + +#[tokio::main] +async fn main() -> Result<()> { + dotenv().ok(); + env_logger::init(); + let url = env::var("TURL")?; + let dir = env::var("TDIR")?; + 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.free_space(dir).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 e3fb8eb..9392909 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,7 @@ use types::BlocklistUpdate; use types::SessionGet; use types::SessionStats; use types::PortTest; +use types::FreeSpace; use types::TorrentAction; use types::{Id, Torrent, TorrentGetField, Torrents}; use types::{Nothing, Result, RpcRequest, RpcResponse, RpcResponseArgument, TorrentRenamePath}; @@ -186,6 +187,43 @@ impl TransClient { self.call(RpcRequest::blocklist_update()).await } + /// Performs a session stats 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, FreeSpace}; + /// + /// #[tokio::main] + /// async fn main() -> Result<()> { + /// dotenv().ok(); + /// env_logger::init(); + /// let url= env::var("TURL")?; + /// let dir = env::var("TDIR")?; + /// let basic_auth = BasicAuth{user: env::var("TUSER")?, password: env::var("TPWD")?}; + /// let client = TransClient::with_auth(&url, basic_auth); + /// let response: Result> = client.free_space(dir).await; + /// match response { + /// Ok(_) => println!("Yay!"), + /// Err(_) => panic!("Oh no!") + /// } + /// println!("Rpc reqsponse is ok: {}", response?.is_ok()); + /// Ok(()) + /// } + /// ``` + pub async fn free_space(&self, path: String) -> Result> { + self.call(RpcRequest::free_space(path)).await + } + /// Performs a port test call /// /// # Errors diff --git a/src/types/mod.rs b/src/types/mod.rs index 5d29ea7..38540e6 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -24,6 +24,7 @@ pub use self::response::SessionGet; pub use self::response::SessionStats; 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::Torrents; diff --git a/src/types/request.rs b/src/types/request.rs index df7d198..97ba4b5 100644 --- a/src/types/request.rs +++ b/src/types/request.rs @@ -30,6 +30,13 @@ impl RpcRequest { } } + pub fn free_space(path: String) -> RpcRequest { + RpcRequest { + method: String::from("free-space"), + arguments: Some(Args::FreeSpaceArgs(FreeSpaceArgs { path })), + } + } + pub fn port_test() -> RpcRequest { RpcRequest { method: String::from("port-test"), @@ -104,6 +111,7 @@ impl ArgumentFields for TorrentGetField {} #[derive(Serialize, Debug, RustcEncodable, Clone)] #[serde(untagged)] pub enum Args { + FreeSpaceArgs(FreeSpaceArgs), TorrentGetArgs(TorrentGetArgs), TorrentActionArgs(TorrentActionArgs), TorrentRemoveArgs(TorrentRemoveArgs), @@ -112,6 +120,11 @@ pub enum Args { TorrentRenamePathArgs(TorrentRenamePathArgs), } +#[derive(Serialize, Debug, RustcEncodable, Clone)] +pub struct FreeSpaceArgs { + path: String, +} + #[derive(Serialize, Debug, RustcEncodable, Clone)] pub struct TorrentGetArgs { #[serde(skip_serializing_if = "Option::is_none")] diff --git a/src/types/response.rs b/src/types/response.rs index 8cf0857..66369ba 100644 --- a/src/types/response.rs +++ b/src/types/response.rs @@ -53,6 +53,14 @@ pub struct BlocklistUpdate { } impl RpcResponseArgument for BlocklistUpdate {} +#[derive(Deserialize, Debug, Clone)] +pub struct FreeSpace { + path: String, + #[serde(rename = "size-bytes")] + size_bytes: i64, +} +impl RpcResponseArgument for FreeSpace {} + #[derive(Deserialize, Debug, Clone)] pub struct PortTest { #[serde(rename = "port-is-open")]