use core::fmt;
use serde::Deserialize;
use serde_json::{from_value, Value};
use crate::{
errors::{ErrorHandle, SteamUserError},
macros::{do_http, optional_argument},
steam_id::{de_steamid_from_str, SteamId},
Steam, BASE,
};
use super::INTERFACE;
const ENDPOINT: &str = "GetFriendList";
const VERSION: &str = "1";
#[derive(PartialEq, Debug, Deserialize, Clone, Copy)]
#[serde(rename_all = "lowercase")]
pub enum Relationship {
All,
Friend,
}
impl fmt::Display for Relationship {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Relationship::All => write!(f, "all"),
Relationship::Friend => write!(f, "friends"),
}
}
}
#[derive(Deserialize, Debug, Clone)]
pub struct Friend {
#[serde(rename = "steamid")]
#[serde(deserialize_with = "de_steamid_from_str")]
pub steam_id: SteamId,
pub relationship: Relationship,
pub friend_since: u32,
}
#[derive(Deserialize, Debug)]
struct FriendsList {
friends: Vec<Friend>,
}
#[derive(Deserialize, Debug)]
struct Wrapper {
#[serde(rename = "friendslist")]
friends_list: Option<FriendsList>,
}
impl Steam {
pub async fn get_friend_list(
&self,
steam_id: SteamId, relationship: Option<Relationship>, ) -> Result<Vec<Friend>, SteamUserError> {
let query = format!(
"?key={}&steamid={}{}",
&self.api_key,
steam_id,
optional_argument!(relationship)
);
let url = format!("{}/{}/{}/v{}/{}", BASE, INTERFACE, ENDPOINT, VERSION, query);
let json = do_http!(url, Value, ErrorHandle, SteamUserError::GetFriendList);
let wrapper: Wrapper =
ErrorHandle!(from_value(json.to_owned()), SteamUserError::GetFriendList);
Ok(wrapper.friends_list.unwrap().friends)
}
}