gw2api-rs 0.3.0

An asynchronous wrapper for the official Guild Wars 2 API
Documentation
//! Exposes information about the characters of an account.
//!

use std::num::NonZeroU8;

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

use crate::{ClientExecutor, RequestBuilder};

use super::{ItemBinding, ItemStats};

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CharacterBackstory {
    pub backstory: Backstory,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CharacterCore {
    pub name: String,
    pub race: Race,
    pub gender: Gender,
    pub profession: Profession,
    pub level: NonZeroU8,
    pub guild: Option<String>,
    pub age: u64,
    pub last_modified: DateTime<Utc>,
    pub created: DateTime<Utc>,
    pub deaths: u64,
    pub title: Option<u64>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CharacterCrafting {
    pub crafting: Crafting,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CharacterEquipment {
    pub equipment: Equipment,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Character {
    // CORE
    pub name: String,
    pub race: Race,
    pub gender: Gender,
    pub profession: Profession,
    pub level: NonZeroU8,
    pub guild: Option<String>,
    pub age: u64,
    pub last_modified: DateTime<Utc>,
    pub created: DateTime<Utc>,
    pub deaths: u64,
    pub title: Option<u64>,
    // BACKSTORY
    pub backstory: Backstory,
    // CRAFTING
    pub crafting: Crafting,
    // EQUIPMENT
    pub equipment: Equipment,
    // EXTRA
    pub flags: CharacterFlags,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Race {
    Asura,
    Charr,
    Human,
    Norn,
    Sylvari,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Gender {
    Male,
    Female,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Profession {
    Elementalist,
    Engineer,
    Guardian,
    Mesmer,
    Necromancer,
    Ranger,
    Revenant,
    Thief,
    Warrior,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Backstory(pub Vec<String>);

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Crafting(pub Vec<CraftingDiscipline>);

#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub struct CraftingDiscipline {
    pub discipline: Discipline,
    pub rating: u16,
    pub active: bool,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Discipline {
    Armorsmith,
    Artificer,
    Chef,
    Huntsman,
    Jeweler,
    Leatherworker,
    Scribe,
    Weaponsmith,
}

#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub struct WvWAbility {
    pub id: u64,
    pub rank: u8,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CharacterFlags(Vec<CharFlag>);

impl CharacterFlags {
    pub fn beta(&self) -> bool {
        self.0.iter().any(|f| *f == CharFlag::Beta)
    }
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
enum CharFlag {
    Beta,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Equipment(pub Vec<EquipmentItem>);

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EquipmentItem {
    pub id: u64,
    pub slot: EquipmentSlot,
    pub infusions: Option<Vec<u64>>,
    pub upgrades: Option<Vec<u64>>,
    pub skin: Option<u64>,
    pub stats: Option<ItemStats>,
    pub binding: ItemBinding,
    pub bound_to: Option<String>,
    pub location: ItemLocation,
    pub tabs: Vec<u64>,
    pub charges: Option<u16>,
    pub dyes: Vec<u64>,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum EquipmentSlot {
    HelmAquatic,
    Backpack,
    Coat,
    Boots,
    Gloves,
    Helm,
    Leggings,
    Shoulders,
    Accessory1,
    Accessory2,
    Ring1,
    Ring2,
    Amulet,
    WeaponAquatic1,
    WeaponAquatic2,
    WeaponA1,
    WeaponA2,
    WeaponB1,
    WeaponB2,
    Sickle,
    Axe,
    Pick,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ItemLocation {
    Equipped,
    Armory,
    EquippedFromLegendaryArmory,
    LegendaryArmory,
}

pub struct BuildTab {
    pub id: u64,
    pub is_active: u64,
    pub build: Build,
}

pub struct Build {
    pub name: String,
    pub profession: Profession,
    pub specializations: [Specialization; 3],
    pub skills: Skills,
    pub aquatic_skills: Skills,
    pub legends: Option<Vec<String>>,
    pub aquatic_legends: Option<Vec<String>>,
    pub pets: Option<Pets>,
}

pub struct Specialization {
    pub id: Option<u16>,
    pub traits: Option<[u64; 3]>,
}

pub struct Skills {
    pub heal: Option<u64>,
    pub utilities: Option<[u64; 3]>,
    pub elite: Option<u64>,
}

pub struct Pets {
    pub terrestrial: Vec<u64>,
    pub aquatic: Vec<u64>,
}