#![allow(clippy::tabs_in_doc_comments)]
use serde::Deserialize;
use reqwest::Error;
mod model;
pub use model::*;
#[derive(Clone)]
pub struct Client {
http: reqwest::Client,
base_url: String,
league: String
}
impl Client {
pub fn new(league: impl AsRef<str>) -> Result<Self, Error> {
Ok(Self{
http: reqwest::Client::builder()
.gzip(true)
.build()?,
base_url: "https://poe.ninja/api".to_string(),
league: league.as_ref().to_string()
})
}
async fn get<T: for<'de> Deserialize<'de>>(&self, path: &str) -> Result<T, Error> {
let url = format!("{}/{}", self.base_url, path);
Ok(self.http.get(&url).send().await?.error_for_status()?.json().await?)
}
async fn get_currency_overview(&self, ctype: &str) -> Result<CurrencyResponse, Error> {
let path = format!("data/CurrencyOverview?league={}&type={}&language=en", self.league, ctype);
self.get(&path).await
}
async fn get_item_overview(&self, itype: &str) -> Result<ItemResponse, Error> {
let path = format!("data/ItemOverview?league={}&type={}&language=en", self.league, itype);
self.get(&path).await
}
pub async fn get_currencies(&self) -> Result<Vec<Currency>, Error> {
Ok(self.get_currency_overview("Currency").await?.lines)
}
pub async fn get_fragments(&self) -> Result<Vec<Currency>, Error> {
Ok(self.get_currency_overview("Fragment").await?.lines)
}
pub async fn get_divination_cards(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("DivinationCard").await?.lines)
}
pub async fn get_artifacts(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Artifact").await?.lines)
}
pub async fn get_prophecies(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Prophecy").await?.lines)
}
pub async fn get_oils(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Oil").await?.lines)
}
pub async fn get_incubators(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Incubator").await?.lines)
}
pub async fn get_unique_weapons(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("UniqueWeapon").await?.lines)
}
pub async fn get_unique_armors(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("UniqueArmour").await?.lines)
}
pub async fn get_unique_accessories(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("UniqueAccessory").await?.lines)
}
pub async fn get_unique_flasks(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("UniqueFlask").await?.lines)
}
pub async fn get_unique_jewels(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("UniqueJewel").await?.lines)
}
pub async fn get_skill_gems(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("SkillGem").await?.lines)
}
pub async fn get_cluster_jewels(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("ClusterJewel").await?.lines)
}
pub async fn get_maps(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Map").await?.lines)
}
pub async fn get_blighted_maps(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("BlightedMap").await?.lines)
}
pub async fn get_unique_maps(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("UniqueMap").await?.lines)
}
pub async fn get_delirium_orbs(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("DeliriumOrb").await?.lines)
}
pub async fn get_invitations(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Invitation").await?.lines)
}
pub async fn get_scarabs(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Scarab").await?.lines)
}
pub async fn get_watchstones(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Watchstone").await?.lines)
}
pub async fn get_base_types(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("BaseType").await?.lines)
}
pub async fn get_fossils(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Fossil").await?.lines)
}
pub async fn get_resonators(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Resonator").await?.lines)
}
pub async fn get_helmet_enchants(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("HelmetEnchant").await?.lines)
}
pub async fn get_beasts(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Beast").await?.lines)
}
pub async fn get_essences(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Essence").await?.lines)
}
pub async fn get_vials(&self) -> Result<Vec<Item>, Error> {
Ok(self.get_item_overview("Vial").await?.lines)
}
}
#[cfg(test)]
mod test;