use polyoxide_core::{HttpClient, QueryBuilder, Request};
use serde::{Deserialize, Serialize};
use crate::{error::GammaError, types::Profile};
#[derive(Clone)]
pub struct User {
pub(crate) http_client: HttpClient,
}
impl User {
pub fn get(&self, signer_address: impl Into<String>) -> Request<UserResponse, GammaError> {
Request::new(self.http_client.clone(), "/public-profile")
.query("address", signer_address.into())
}
pub fn get_by_address(&self, address: impl Into<String>) -> Request<Profile, GammaError> {
Request::new(
self.http_client.clone(),
format!(
"/profiles/user_address/{}",
urlencoding::encode(&address.into())
),
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserResponse {
#[serde(rename = "proxyWallet")]
pub proxy: Option<String>,
pub address: Option<String>,
pub id: Option<String>,
pub name: Option<String>,
pub created_at: Option<String>,
pub profile_image: Option<String>,
pub display_username_public: Option<bool>,
pub bio: Option<String>,
pub pseudonym: Option<String>,
pub x_username: Option<String>,
pub verified_badge: Option<bool>,
#[serde(default)]
pub users: Vec<UserInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserInfo {
pub id: Option<String>,
#[serde(default)]
pub creator: bool,
#[serde(rename = "mod")]
#[serde(default)]
pub moderator: bool,
}
#[cfg(test)]
mod tests {
use crate::Gamma;
fn gamma() -> Gamma {
Gamma::new().unwrap()
}
#[test]
fn test_get_by_address_accepts_str_and_string() {
let _r1 = gamma().user().get_by_address("0xdeadbeef");
let _r2 = gamma().user().get_by_address(String::from("0xdeadbeef"));
}
}