aboutsummaryrefslogtreecommitdiffstats
path: root/src/zotapi.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/zotapi.rs')
-rw-r--r--src/zotapi.rs57
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()
}
}