Skip to main content

circle_developer_controlled_wallets/models/
wallet_set.rs

1//! Wallet set resource models for the Circle Developer-Controlled Wallets API.
2//!
3//! Contains request parameters and response types for wallet set management
4//! endpoints.
5
6use super::common::{CustodyType, PageParams};
7
8/// A wallet set resource.
9#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct WalletSet {
12    /// Unique wallet set ID (UUID).
13    pub id: String,
14    /// Custody type for wallets within this set.
15    pub custody_type: CustodyType,
16    /// ISO-8601 creation timestamp.
17    pub create_date: String,
18    /// ISO-8601 last-update timestamp.
19    pub update_date: String,
20    /// Human-readable name.
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub name: Option<String>,
23    /// User ID associated with this wallet set (user-controlled wallets).
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub user_id: Option<String>,
26}
27
28/// Inner data of a list-wallet-sets response.
29#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct WalletSetsData {
32    /// Wallet sets matching the query.
33    pub wallet_sets: Vec<WalletSet>,
34}
35
36/// Response wrapper for the list-wallet-sets endpoint.
37#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
38pub struct WalletSets {
39    /// Response data.
40    pub data: WalletSetsData,
41}
42
43/// Inner data of a single wallet-set response.
44#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
45#[serde(rename_all = "camelCase")]
46pub struct WalletSetData {
47    /// The wallet set.
48    pub wallet_set: WalletSet,
49}
50
51/// Response wrapper for create/get/update wallet-set endpoints.
52#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
53pub struct WalletSetResponse {
54    /// Response data.
55    pub data: WalletSetData,
56}
57
58/// Request body for creating a new wallet set.
59#[derive(Debug, Clone, serde::Serialize)]
60#[serde(rename_all = "camelCase")]
61pub struct CreateWalletSetRequest {
62    /// Encrypted entity secret ciphertext.
63    pub entity_secret_ciphertext: String,
64    /// Idempotency key (UUID) to deduplicate requests.
65    pub idempotency_key: String,
66    /// Optional human-readable name for the wallet set.
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub name: Option<String>,
69}
70
71/// Request body for updating a wallet set.
72#[derive(Debug, Clone, serde::Serialize)]
73#[serde(rename_all = "camelCase")]
74pub struct UpdateWalletSetRequest {
75    /// New human-readable name for the wallet set.
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub name: Option<String>,
78}
79
80/// Query parameters for the list-wallet-sets endpoint.
81#[derive(Debug, Default, Clone, serde::Serialize)]
82#[serde(rename_all = "camelCase")]
83pub struct ListWalletSetsParams {
84    /// Pagination parameters.
85    #[serde(flatten)]
86    pub page: PageParams,
87}
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92
93    #[test]
94    fn wallet_set_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
95        let json = r#"{
96            "data": {
97                "walletSet": {
98                    "id": "f5d71c75-b8e3-4d1e-ae38-e8c3c3c3c3c3",
99                    "custodyType": "DEVELOPER",
100                    "createDate": "2024-01-01T00:00:00Z",
101                    "updateDate": "2024-01-01T00:00:00Z",
102                    "name": "My Wallet Set"
103                }
104            }
105        }"#;
106        let resp: WalletSetResponse = serde_json::from_str(json)?;
107        assert_eq!(resp.data.wallet_set.id, "f5d71c75-b8e3-4d1e-ae38-e8c3c3c3c3c3");
108        assert_eq!(resp.data.wallet_set.name.as_deref(), Some("My Wallet Set"));
109        Ok(())
110    }
111
112    #[test]
113    fn wallet_sets_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
114        let json = r#"{
115            "data": {
116                "walletSets": [
117                    {
118                        "id": "aaa",
119                        "custodyType": "DEVELOPER",
120                        "createDate": "2024-01-01T00:00:00Z",
121                        "updateDate": "2024-01-01T00:00:00Z"
122                    }
123                ]
124            }
125        }"#;
126        let resp: WalletSets = serde_json::from_str(json)?;
127        assert_eq!(resp.data.wallet_sets.len(), 1);
128        assert_eq!(resp.data.wallet_sets[0].id, "aaa");
129        Ok(())
130    }
131
132    #[test]
133    fn create_wallet_set_request_serializes() -> Result<(), Box<dyn std::error::Error>> {
134        let req = CreateWalletSetRequest {
135            entity_secret_ciphertext: "cipher123".to_string(),
136            idempotency_key: "key123".to_string(),
137            name: Some("Test".to_string()),
138        };
139        let json = serde_json::to_string(&req)?;
140        assert!(json.contains("entitySecretCiphertext"));
141        assert!(json.contains("idempotencyKey"));
142        Ok(())
143    }
144}