Skip to main content

composio_sdk/models/
cli.rs

1//! CLI session models for Composio API.
2
3use serde::{Deserialize, Serialize};
4
5/// CLI session status.
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
7#[serde(rename_all = "snake_case")]
8pub enum CliSessionStatus {
9    /// Session exists but has not been linked to an account.
10    Pending,
11    /// Session has been linked to an account.
12    Linked,
13}
14
15/// Linked account payload returned for linked CLI sessions.
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
17pub struct CliLinkedAccount {
18    /// Linked account ID.
19    pub id: String,
20    /// Linked account email.
21    pub email: String,
22    /// Linked account display name.
23    pub name: String,
24}
25
26/// Query parameters for retrieving a CLI session.
27#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
28pub struct CliGetSessionParams {
29    /// CLI session UUID or 6-character code.
30    pub id: String,
31}
32
33/// Response for creating a CLI session.
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
35pub struct CliCreateSessionResponse {
36    /// Unique CLI session identifier.
37    pub id: String,
38    /// 6-character login code.
39    pub code: String,
40    /// Session expiry timestamp.
41    #[serde(rename = "expiresAt", alias = "expires_at")]
42    pub expires_at: String,
43    /// Session status.
44    pub status: CliSessionStatus,
45}
46
47/// Response for retrieving a CLI session.
48#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
49pub struct CliGetSessionResponse {
50    /// Unique CLI session identifier.
51    pub id: String,
52    /// Linked account details, when linked.
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub account: Option<CliLinkedAccount>,
55    /// API key, when linked.
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub api_key: Option<String>,
58    /// 6-character login code.
59    pub code: String,
60    /// Session expiry timestamp.
61    #[serde(rename = "expiresAt", alias = "expires_at")]
62    pub expires_at: String,
63    /// Session status.
64    pub status: CliSessionStatus,
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn test_cli_get_session_params_serialization() {
73        let params = CliGetSessionParams {
74            id: "ABC123".to_string(),
75        };
76
77        let value = serde_json::to_value(&params).unwrap();
78        assert_eq!(value["id"], "ABC123");
79    }
80
81    #[test]
82    fn test_cli_create_session_response_deserialization_with_expires_alias() {
83        let payload = r#"{
84            "id": "2f3f9f6b-7d13-4d8e-9a2f-b5ebbd8b1832",
85            "code": "ABC123",
86            "expiresAt": "2026-01-01T00:00:00.000Z",
87            "status": "pending"
88        }"#;
89
90        let response: CliCreateSessionResponse = serde_json::from_str(payload).unwrap();
91        assert_eq!(response.code, "ABC123");
92        assert_eq!(response.status, CliSessionStatus::Pending);
93        assert_eq!(response.expires_at, "2026-01-01T00:00:00.000Z");
94    }
95
96    #[test]
97    fn test_cli_get_session_response_deserialization_with_linked_account() {
98        let payload = r#"{
99            "id": "2f3f9f6b-7d13-4d8e-9a2f-b5ebbd8b1832",
100            "code": "ABC123",
101            "expiresAt": "2026-01-01T00:00:00.000Z",
102            "status": "linked",
103            "api_key": "cmp_test_key",
104            "account": {
105                "id": "user_123",
106                "email": "demo@example.com",
107                "name": "Demo User"
108            }
109        }"#;
110
111        let response: CliGetSessionResponse = serde_json::from_str(payload).unwrap();
112        assert_eq!(response.status, CliSessionStatus::Linked);
113        assert_eq!(response.api_key.as_deref(), Some("cmp_test_key"));
114        assert_eq!(response.account.unwrap().email, "demo@example.com");
115    }
116}