use crate::attributes::Attribute;
use crate::client::Client;
use crate::error::ApiError;
use crate::utils::ids_to_string;
use std::collections::HashMap;
const ENDPOINT_URL: &str = "/v2/pvp/amulets";
#[derive(Debug, Deserialize, PartialEq)]
pub struct Amulet {
id: u32,
name: String,
#[serde(rename = "icon")]
icon_url: String,
attributes: HashMap<Attribute, i32>,
}
impl Amulet {
pub fn get_id(client: &Client, id: u32) -> Result<Amulet, ApiError> {
let url = format!("{}?id={}", ENDPOINT_URL, id);
client.request(&url)
}
pub fn get_all_ids(client: &Client) -> Result<Vec<u32>, ApiError> {
client.request(ENDPOINT_URL)
}
pub fn get_amulets_by_ids(client: &Client, ids: Vec<u32>) -> Result<Vec<Amulet>, ApiError> {
let url = format!("{}?ids={}", ENDPOINT_URL, ids_to_string(ids));
client.request(&url)
}
pub fn get_all_amulets(client: &Client) -> Result<Vec<Amulet>, ApiError> {
let url = format!("{}?ids=all", ENDPOINT_URL);
client.request(&url)
}
pub fn id(&self) -> u32 {
self.id
}
pub fn name(&self) -> &str {
&self.name
}
pub fn icon_url(&self) -> &str {
&self.icon_url
}
pub fn attributes(&self) -> &HashMap<Attribute, i32> {
&self.attributes
}
}
#[cfg(test)]
mod tests {
use crate::v2::pvp::amulets::*;
use crate::attributes::Attribute;
use crate::client::Client;
use std::collections::HashMap;
const JSON_AMULET: &str = r#"
{
"id": 4,
"name": "Assassin Amulet",
"icon": "https://render.guildwars2.com/file/02E9EFDEF9587130A25F17AC396913FBBE3C716D/455602.png",
"attributes": {
"Precision": 1200,
"Power": 900,
"CritDamage": 900
}
}"#;
#[test]
fn create_amulet() {
match serde_json::from_str::<Amulet>(JSON_AMULET) {
Ok(_) => assert!(true),
Err(e) => panic!(e.to_string()),
}
}
#[test]
fn accessors() {
let amulet = serde_json::from_str::<Amulet>(JSON_AMULET).unwrap();
let mut attributes = HashMap::new();
attributes.insert(Attribute::Precision, 1200);
attributes.insert(Attribute::Power, 900);
attributes.insert(Attribute::CritDamage, 900);
assert_eq!(4, amulet.id());
assert_eq!("Assassin Amulet", amulet.name());
assert_eq!("https://render.guildwars2.com/file/02E9EFDEF9587130A25F17AC396913FBBE3C716D/455602.png", amulet.icon_url());
assert_eq!(&attributes, amulet.attributes());
}
#[test]
fn get_all_ids() {
let client = Client::new();
let num_amulets = 12;
assert!(Amulet::get_all_ids(&client).unwrap().len() >= num_amulets);
}
#[test]
fn get_amulet_by_id() {
let client = Client::new();
let amulet = serde_json::from_str::<Amulet>(JSON_AMULET).unwrap();
assert_eq!(amulet, Amulet::get_id(&client, amulet.id()).unwrap());
}
#[test]
fn get_ids() {
let client = Client::new();
let mut ids: Vec<u32> = Vec::new();
ids.push(1);
ids.push(90909); let amulets = Amulet::get_amulets_by_ids(&client, ids).unwrap();
assert!(amulets.len() == 1);
}
#[test]
fn get_all_amulets() {
let client = Client::new();
let num_amulets = 12;
let amulets = Amulet::get_all_amulets(&client).unwrap();
assert!(amulets.len() >= num_amulets);
}
}