Skip to main content

circle_developer_controlled_wallets/models/
token.rs

1//! Token resource models for the Circle Developer-Controlled Wallets API.
2//!
3//! Contains response types for the token lookup endpoint.
4//! The [`Token`] struct itself is defined in [`crate::models::wallet`].
5
6use super::wallet::Token;
7
8/// Inner data of a get-token response.
9#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct TokenData {
12    /// The token resource.
13    pub token: Token,
14}
15
16/// Response wrapper for the get-token endpoint.
17#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
18pub struct TokenResponse {
19    /// Response data.
20    pub data: TokenData,
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26    use crate::models::common::Blockchain;
27
28    #[test]
29    fn token_response_deserializes() -> Result<(), Box<dyn std::error::Error>> {
30        let json = r#"{
31            "data": {
32                "token": {
33                    "id": "token-id-1",
34                    "blockchain": "ETH",
35                    "isNative": false,
36                    "name": "USD Coin",
37                    "symbol": "USDC",
38                    "decimals": 6,
39                    "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
40                    "updateDate": "2024-01-01T00:00:00Z",
41                    "createDate": "2024-01-01T00:00:00Z"
42                }
43            }
44        }"#;
45        let resp: TokenResponse = serde_json::from_str(json)?;
46        assert_eq!(resp.data.token.blockchain, Blockchain::Eth);
47        assert_eq!(resp.data.token.symbol.as_deref(), Some("USDC"));
48        assert_eq!(resp.data.token.decimals, Some(6));
49        Ok(())
50    }
51
52    #[test]
53    fn token_response_native_deserializes() -> Result<(), Box<dyn std::error::Error>> {
54        let json = r#"{
55            "data": {
56                "token": {
57                    "blockchain": "MATIC",
58                    "isNative": true,
59                    "name": "MATIC",
60                    "symbol": "MATIC",
61                    "decimals": 18
62                }
63            }
64        }"#;
65        let resp: TokenResponse = serde_json::from_str(json)?;
66        assert!(resp.data.token.is_native);
67        assert_eq!(resp.data.token.blockchain, Blockchain::Matic);
68        Ok(())
69    }
70}