use crate::{Result, RideWithGpsClient};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct User {
pub id: u64,
pub name: Option<String>,
pub first_name: Option<String>,
pub last_name: Option<String>,
pub display_name: Option<String>,
pub email: Option<String>,
pub location: Option<String>,
pub description: Option<String>,
pub avatar_url: Option<String>,
pub premium: Option<bool>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
}
impl RideWithGpsClient {
pub fn get_current_user(&self) -> Result<User> {
#[derive(Deserialize)]
struct UserWrapper {
user: User,
}
let wrapper: UserWrapper = self.get("/api/v1/users/current.json")?;
Ok(wrapper.user)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_user_deserialization() {
let json = r#"{
"id": 123,
"name": "Test User",
"email": "test@example.com",
"premium": true
}"#;
let user: User = serde_json::from_str(json).unwrap();
assert_eq!(user.id, 123);
assert_eq!(user.name.as_deref(), Some("Test User"));
assert_eq!(user.email.as_deref(), Some("test@example.com"));
assert_eq!(user.premium, Some(true));
}
#[test]
fn test_user_wrapper_deserialization() {
let json = r#"{
"user": {
"id": 456,
"name": "Wrapped User",
"first_name": "Wrapped",
"last_name": "User",
"email": "wrapped@example.com"
}
}"#;
#[derive(Deserialize)]
struct UserWrapper {
user: User,
}
let wrapper: UserWrapper = serde_json::from_str(json).unwrap();
assert_eq!(wrapper.user.id, 456);
assert_eq!(wrapper.user.name.as_deref(), Some("Wrapped User"));
assert_eq!(wrapper.user.first_name.as_deref(), Some("Wrapped"));
assert_eq!(wrapper.user.last_name.as_deref(), Some("User"));
}
#[test]
fn test_user_with_all_fields() {
let json = r#"{
"id": 789,
"name": "Full User",
"first_name": "Full",
"last_name": "User",
"display_name": "fulluser",
"email": "full@example.com",
"location": "San Francisco, CA",
"description": "Avid cyclist",
"avatar_url": "https://example.com/avatar.jpg",
"premium": true,
"created_at": "2020-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}"#;
let user: User = serde_json::from_str(json).unwrap();
assert_eq!(user.id, 789);
assert_eq!(user.display_name.as_deref(), Some("fulluser"));
assert_eq!(user.location.as_deref(), Some("San Francisco, CA"));
assert_eq!(user.description.as_deref(), Some("Avid cyclist"));
assert_eq!(user.premium, Some(true));
}
}