added generic sender

This commit is contained in:
red 2020-04-20 17:44:23 +02:00
parent 5f131322ca
commit 4a9077b95f
6 changed files with 55 additions and 38 deletions

View File

@ -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<RpcResponse<SessionInfo>> = client.get_session().await;
let response: Result<RpcResponse<SessionInfo>> = client.session_get().await;
match response {
Ok(_) => println!("Yay!"),
Err(_) => panic!("Oh no!")

View File

@ -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<RpcResponse<SessionInfo>> {
pub async fn session_get(&self) -> Result<RpcResponse<SessionInfo>> {
self.call(SessionGet::new()).await
}
pub async fn torrent_get(&self) -> Result<RpcResponse<>>{}
async fn call<T, U> (&self, request: T) -> Result<RpcResponse<U>>
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<SessionInfo> = resp.json().await?;
let rpc_response: RpcResponse<U> = 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(())
}
}

View File

@ -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,
}

View File

@ -1,13 +1,19 @@
mod request;
mod response;
mod entity;
pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
#[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;
pub(crate) use self::response::RpcResponseArgument;
pub use self::response::SessionInfo;

View File

@ -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") }
}
}
}
pub trait RpcRequestArgument {}
impl RpcRequestArgument for SessionGet{}

View File

@ -3,4 +3,21 @@ use serde::Deserialize;
pub struct RpcResponse<T> {
arguments: T,
result: 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,
}
pub trait RpcResponseArgument {}
impl RpcResponseArgument for SessionInfo{}