From 4a9077b95f24ac05750a09f61915d61ed6a0fde3 Mon Sep 17 00:00:00 2001 From: red Date: Mon, 20 Apr 2020 17:44:23 +0200 Subject: [PATCH] added generic sender --- examples/get_session.rs | 2 +- src/lib.rs | 29 ++++++++++++++++++++--------- src/types/entity.rs | 21 --------------------- src/types/mod.rs | 12 +++++++++--- src/types/request.rs | 10 +++++++--- src/types/response.rs | 19 ++++++++++++++++++- 6 files changed, 55 insertions(+), 38 deletions(-) delete mode 100644 src/types/entity.rs diff --git a/examples/get_session.rs b/examples/get_session.rs index 6961bbb..f948795 100644 --- a/examples/get_session.rs +++ b/examples/get_session.rs @@ -12,7 +12,7 @@ async fn main() -> Result<()> { 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.get_session().await; + let response: Result> = client.session_get().await; match response { Ok(_) => println!("Yay!"), Err(_) => panic!("Oh no!") diff --git a/src/lib.rs b/src/lib.rs index 5ba79b2..2e42c3e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ -#[allow(unused_imports)] -#[allow(dead_code)] +// #[allow(unused_imports)] +// #[allow(dead_code)] extern crate ajson; extern crate bb8; @@ -10,10 +10,12 @@ extern crate log; extern crate reqwest; extern crate tokio_postgres; +use serde::Serialize; +use serde::de::DeserializeOwned; use reqwest::header::CONTENT_TYPE; pub mod types; -use types::{Result, RpcResponse, SessionGet, SessionInfo}; +use types::{Result, RpcRequestArgument, RpcResponse, RpcResponseArgument, SessionGet, SessionInfo}; use types::BasicAuth; pub struct TransClient { @@ -50,7 +52,7 @@ impl TransClient { async fn get_session_id(&self) -> String { info!("Requesting session id info"); let response: reqwest::Response = self.rpc_request() - .json(&SessionGet::default()) + .json(&SessionGet::new()) .send() .await .unwrap(); @@ -65,15 +67,24 @@ impl TransClient { } - pub async fn get_session(&self) -> Result> { + pub async fn session_get(&self) -> Result> { + self.call(SessionGet::new()).await + } + + pub async fn torrent_get(&self) -> Result>{} + + async fn call (&self, request: T) -> Result> + where T : RpcRequestArgument + Serialize, + U : RpcResponseArgument + DeserializeOwned + std::fmt::Debug + { info!("Loaded auth: {:?}", &self.auth); let rq: reqwest::RequestBuilder = self.rpc_request() .header("X-Transmission-Session-Id", self.get_session_id().await) - .json(&SessionGet::default()); - debug!("Request body: {:?}", rq.try_clone().unwrap().body_string()?); + .json(&request); + info!("Request body: {:?}", rq.try_clone().unwrap().body_string()?); let resp: reqwest::Response = rq.send().await?; // print!("{:?}", resp.text().await); - let rpc_response: RpcResponse = resp.json().await?; + let rpc_response: RpcResponse = resp.json().await?; info!("{:#?}", rpc_response); Ok(rpc_response) } @@ -104,7 +115,7 @@ mod tests { env_logger::init(); let url= env::var("TURL")?; let basic_auth = BasicAuth{user: env::var("TUSER")?, password: env::var("TPWD")?}; - TransClient::with_auth(&url, basic_auth).get_session().await; + TransClient::with_auth(&url, basic_auth).session_get().await; Ok(()) } } diff --git a/src/types/entity.rs b/src/types/entity.rs deleted file mode 100644 index e1341ca..0000000 --- a/src/types/entity.rs +++ /dev/null @@ -1,21 +0,0 @@ -use serde::Deserialize; - -#[derive(Debug)] -pub struct BasicAuth { - pub user: String, - pub password: String, -} - -#[derive(Deserialize, Debug)] -pub struct SessionInfo { - #[serde(rename="blocklist-enabled")] - blocklist_enabled: bool, - #[serde(rename="download-dir")] - download_dir: String, - encryption: String, - #[serde(rename="rpc-version")] - rpc_version: i32, - #[serde(rename="rpc-version-minimum")] - rpc_version_minimum: i32, - version: String, -} \ No newline at end of file diff --git a/src/types/mod.rs b/src/types/mod.rs index fc046cb..20f05f7 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,13 +1,19 @@ mod request; mod response; -mod entity; pub type Result = std::result::Result>; +#[derive(Debug)] +pub struct BasicAuth { + pub user: String, + pub password: String, +} + +pub(crate) use self::request::RpcRequestArgument; pub(crate) use self::request::SessionGet; pub use self::response::RpcResponse; -pub use self::entity::BasicAuth; -pub use self::entity::SessionInfo; \ No newline at end of file +pub(crate) use self::response::RpcResponseArgument; +pub use self::response::SessionInfo; \ No newline at end of file diff --git a/src/types/request.rs b/src/types/request.rs index 60fca26..022d2a7 100644 --- a/src/types/request.rs +++ b/src/types/request.rs @@ -5,8 +5,12 @@ pub struct SessionGet { method: String } -impl Default for SessionGet{ - fn default() -> SessionGet { +impl SessionGet{ + pub fn new() -> SessionGet { SessionGet { method: String::from("session-get") } } -} \ No newline at end of file +} + + +pub trait RpcRequestArgument {} +impl RpcRequestArgument for SessionGet{} \ No newline at end of file diff --git a/src/types/response.rs b/src/types/response.rs index 641adc0..37ff59e 100644 --- a/src/types/response.rs +++ b/src/types/response.rs @@ -3,4 +3,21 @@ use serde::Deserialize; pub struct RpcResponse { arguments: T, result: String -} \ No newline at end of file +} + +#[derive(Deserialize, Debug)] +pub struct SessionInfo { + #[serde(rename="blocklist-enabled")] + blocklist_enabled: bool, + #[serde(rename="download-dir")] + download_dir: String, + encryption: String, + #[serde(rename="rpc-version")] + rpc_version: i32, + #[serde(rename="rpc-version-minimum")] + rpc_version_minimum: i32, + version: String, +} + +pub trait RpcResponseArgument {} +impl RpcResponseArgument for SessionInfo{} \ No newline at end of file