use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum CliSessionStatus {
Pending,
Linked,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CliLinkedAccount {
pub id: String,
pub email: String,
pub name: String,
}
#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct CliGetSessionParams {
pub id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CliCreateSessionResponse {
pub id: String,
pub code: String,
#[serde(rename = "expiresAt", alias = "expires_at")]
pub expires_at: String,
pub status: CliSessionStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CliGetSessionResponse {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub account: Option<CliLinkedAccount>,
#[serde(skip_serializing_if = "Option::is_none")]
pub api_key: Option<String>,
pub code: String,
#[serde(rename = "expiresAt", alias = "expires_at")]
pub expires_at: String,
pub status: CliSessionStatus,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cli_get_session_params_serialization() {
let params = CliGetSessionParams {
id: "ABC123".to_string(),
};
let value = serde_json::to_value(¶ms).unwrap();
assert_eq!(value["id"], "ABC123");
}
#[test]
fn test_cli_create_session_response_deserialization_with_expires_alias() {
let payload = r#"{
"id": "2f3f9f6b-7d13-4d8e-9a2f-b5ebbd8b1832",
"code": "ABC123",
"expiresAt": "2026-01-01T00:00:00.000Z",
"status": "pending"
}"#;
let response: CliCreateSessionResponse = serde_json::from_str(payload).unwrap();
assert_eq!(response.code, "ABC123");
assert_eq!(response.status, CliSessionStatus::Pending);
assert_eq!(response.expires_at, "2026-01-01T00:00:00.000Z");
}
#[test]
fn test_cli_get_session_response_deserialization_with_linked_account() {
let payload = r#"{
"id": "2f3f9f6b-7d13-4d8e-9a2f-b5ebbd8b1832",
"code": "ABC123",
"expiresAt": "2026-01-01T00:00:00.000Z",
"status": "linked",
"api_key": "cmp_test_key",
"account": {
"id": "user_123",
"email": "demo@example.com",
"name": "Demo User"
}
}"#;
let response: CliGetSessionResponse = serde_json::from_str(payload).unwrap();
assert_eq!(response.status, CliSessionStatus::Linked);
assert_eq!(response.api_key.as_deref(), Some("cmp_test_key"));
assert_eq!(response.account.unwrap().email, "demo@example.com");
}
}