use std::ffi::CString;
use std::fs::canonicalize;
use std::mem;
use std::path::PathBuf;
use transmission_sys;
#[derive(Default)]
pub struct ClientConfig {
pub(crate) app_name: Option<String>,
pub(crate) config_dir: Option<PathBuf>,
download_dir: Option<PathBuf>,
use_utp: bool,
log_level: i64,
rpc_enabled: bool,
rpc_url: Option<String>,
rpc_port: Option<String>,
}
impl ClientConfig {
pub fn new() -> Self {
Self {
app_name: None,
config_dir: None,
download_dir: None,
use_utp: true,
log_level: 1,
rpc_enabled: false,
rpc_url: None,
rpc_port: None,
}
}
pub fn app_name(mut self, name: &str) -> Self {
self.app_name = Some(String::from(name));
self
}
pub fn config_dir(mut self, dir: &str) -> Self {
self.config_dir = Some(canonicalize(dir).unwrap());
self
}
pub fn download_dir(mut self, dir: &str) -> Self {
self.download_dir = Some(canonicalize(dir).unwrap());
self
}
pub fn use_utp(mut self, utp: bool) -> Self {
self.use_utp = utp;
self
}
pub fn log_level(mut self, level: i64) -> Self {
self.log_level = level;
self
}
pub fn rpc_enabled(mut self, rpc: bool) -> Self {
self.rpc_enabled = rpc;
self
}
pub fn rpc_url(mut self, rpc_url: String) -> Self {
self.rpc_url = Some(rpc_url);
self
}
pub fn rpc_port(mut self, rpc_port: String) -> Self {
self.rpc_port = Some(rpc_port);
self
}
pub(crate) unsafe fn to_variant(self) -> transmission_sys::tr_variant {
let mut variant: transmission_sys::tr_variant = mem::uninitialized();
transmission_sys::tr_variantInitDict(&mut variant, 0);
if let Some(download_dir) = self.download_dir {
let d_dir = CString::new(download_dir.to_str().unwrap()).unwrap();
transmission_sys::tr_variantDictAddStr(
&mut variant,
transmission_sys::TR_KEY_download_dir as usize,
d_dir.as_ptr(),
);
}
transmission_sys::tr_variantDictAddBool(
&mut variant,
transmission_sys::TR_KEY_utp_enabled as usize,
self.use_utp,
);
transmission_sys::tr_variantDictAddInt(
&mut variant,
transmission_sys::TR_KEY_message_level as usize,
self.log_level,
);
transmission_sys::tr_variantDictAddBool(
&mut variant,
transmission_sys::TR_KEY_rpc_enabled as usize,
self.rpc_enabled,
);
if self.rpc_enabled {
if let Some(rpc_url) = self.rpc_url {
let r_url = CString::new(rpc_url).unwrap();
transmission_sys::tr_variantDictAddStr(
&mut variant,
transmission_sys::TR_KEY_rpc_url as usize,
r_url.as_ptr(),
);
}
if let Some(rpc_port) = self.rpc_port {
let r_port = CString::new(rpc_port).unwrap();
transmission_sys::tr_variantDictAddStr(
&mut variant,
transmission_sys::TR_KEY_rpc_port as usize,
r_port.as_ptr(),
);
}
}
variant
}
}