diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2023-03-29 13:08:09 +0200 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2023-03-29 13:08:09 +0200 |
commit | 8100cff32bf0c87dc19fba78f3faac8090f863da (patch) | |
tree | 7c6315dbb83162b8d91aae53b920c2e7f20a4268 /src/zotapi.rs | |
parent | a4b9520f430ce188ba9165dcabd3320763ff2e16 (diff) | |
download | rust-zotapi-8100cff32bf0c87dc19fba78f3faac8090f863da.tar.gz rust-zotapi-8100cff32bf0c87dc19fba78f3faac8090f863da.tar.bz2 rust-zotapi-8100cff32bf0c87dc19fba78f3faac8090f863da.zip |
Another reqrite...
Third time must be where it sits I hope.
I felt the API was getting a bit too distracted by unnecessary
constructs and abstractions, so I'm trying to simplify it by making it
more straight forward.
The idea now is to have one main API class (ZotApi), and all the various
remote API's as public methods on this basic class. Iow, the ZotApi
class is mainly based on the existing `Client` class, which is then
being phased out.
And instead of having each API tied to the data type they return, I'm
just adding methods that will return the respective data types. This
should reduce coupling between the returned data, and the API calls
themselves.
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() } } |