use serde::{Deserialize, Serialize};
use crate::classic::WorldOfWarcraftClassicConnector;
use crate::documents::{DocumentKey, Links};
use crate::errors::BubbleHearthResult;
use crate::localization::StringOrStructLocale;
use crate::search::SearchResult;
use crate::timezone::Timezone;
#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct RealmsIndex {
#[serde(rename = "_links")]
pub links: Links,
pub realms: Vec<Realm>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Realm {
#[serde(rename = "_links")]
pub links: Option<Links>,
pub key: Option<DocumentKey>,
pub name: StringOrStructLocale,
pub id: u64,
pub slug: String,
pub category: Option<StringOrStructLocale>,
pub locale: Option<String>,
pub timezone: Option<Timezone>,
pub is_tournament: Option<bool>,
pub region: Option<RealmRegion>,
#[serde(rename = "type")]
pub realm_type: Option<RealmType>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RealmRegion {
pub key: Option<DocumentKey>,
pub name: StringOrStructLocale,
pub id: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RealmType {
#[serde(rename = "type")]
pub realm_type: String,
pub name: StringOrStructLocale,
}
impl<'a> WorldOfWarcraftClassicConnector<'a> {
pub async fn get_realms(&self) -> BubbleHearthResult<RealmsIndex> {
let url = format!(
"https://{}.api.blizzard.com/data/wow/realm/index?locale={}",
self.client.region.get_region_abbreviation(),
self.client.locale.get_normalized_locale(),
);
let realms = self
.client
.send_request_and_deserialize::<RealmsIndex>(url)
.await?;
Ok(realms)
}
pub async fn get_realm(&self, slug: &str) -> BubbleHearthResult<Option<Realm>> {
let url = format!(
"https://{}.api.blizzard.com/data/wow/realm/{}?locale={}",
self.client.region.get_region_abbreviation(),
slug,
self.client.locale.get_normalized_locale()
);
let realm = self
.client
.send_request_and_optionally_deserialize::<Realm>(url)
.await?;
Ok(realm)
}
pub async fn search_realms(
&self,
timezone: Option<Timezone>,
order_by: Option<String>,
page: Option<u32>,
) -> BubbleHearthResult<SearchResult<Realm>> {
let mut url = format!(
"https://{}.api.blizzard.com/data/wow/search/realm?_page={}",
self.client.region.get_region_abbreviation(),
page.unwrap_or(1)
);
if let Some(zone) = timezone {
let zone_string: String = zone.into();
url.push_str(&format!("&timezone={}", zone_string));
}
if let Some(order) = order_by {
url.push_str(&format!("&orderby={}", order));
}
let search_result = self
.client
.send_request_and_deserialize::<SearchResult<Realm>>(url)
.await?;
Ok(search_result)
}
}