diff options
Diffstat (limited to 'src/zotapi.rs')
-rw-r--r-- | src/zotapi.rs | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/src/zotapi.rs b/src/zotapi.rs index 87a2f0e..9e13d99 100644 --- a/src/zotapi.rs +++ b/src/zotapi.rs @@ -14,8 +14,59 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. -pub trait ZotAPI<T: Default> { - fn z() -> T { - T::default() +use crate::Channel; +use url::Url; +use reqwest::{ + self, + header::{ACCEPT}, +}; +use serde::Serialize; + +#[derive(Debug)] +pub struct ZotApi { + client: reqwest::Client, + base_url: Url, + channel: String, + pw: String, +} + +pub fn new(url: &str, channel: &str, pw: &str) -> ZotApi { + ZotApi { + client: reqwest::Client::new(), + base_url: Url::parse(url).unwrap().join("api/z/1.0/").unwrap(), + channel: String::from(channel), + pw: String::from(pw), + } +} + +impl ZotApi { + pub async fn verify(&self) -> Result<Channel, Box<dyn std::error::Error>> { + let raw = self.get("verify").send().await?.text().await?; + let mut channel: Channel = serde_json::from_str(&raw)?; + channel.xchan = serde_json::from_str(&raw)?; + + Ok(channel) + } + + + /// Return a RequestBuilder object that's set up with the correct + /// path and headers for performing a zot api request. + pub fn get(&self, path: &str) -> reqwest::RequestBuilder { + self.client.get(&self.url(path, &())) + .header(ACCEPT, "application/json") + .basic_auth(self.channel.clone(), Some(self.pw.clone())) + } + + fn url<T>(&self, path: &str, args: &T) -> String + where + T: Serialize + std::fmt::Debug, + { + let mut r = self.base_url.clone().join(path).unwrap(); + + if let Ok(a) = serde_qs::to_string(dbg!(args)) { + r.set_query(Some(&a)); + } + + r.to_string() } } |