Skip to main content

deribit_http/model/response/
wallet.rs

1/******************************************************************************
2   Author: Joaquín Béjar García
3   Email: jb@taunais.com
4   Date: 2025
5******************************************************************************/
6//! Response models for wallet operations.
7
8use crate::model::wallet::AddressBookEntry;
9use pretty_simple_display::{DebugPretty, DisplaySimple};
10use serde::{Deserialize, Serialize};
11
12/// Response containing a list of address book entries.
13///
14/// Returned by the `/private/get_address_book` endpoint.
15#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize, Default)]
16pub struct AddressBookResponse {
17    /// List of address book entries
18    pub entries: Vec<AddressBookEntry>,
19}
20
21impl AddressBookResponse {
22    /// Creates a new address book response.
23    #[must_use]
24    pub fn new(entries: Vec<AddressBookEntry>) -> Self {
25        Self { entries }
26    }
27
28    /// Returns true if the response contains no entries.
29    #[must_use]
30    #[inline]
31    pub fn is_empty(&self) -> bool {
32        self.entries.is_empty()
33    }
34
35    /// Returns the number of entries in the response.
36    #[must_use]
37    #[inline]
38    pub fn len(&self) -> usize {
39        self.entries.len()
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_address_book_response_new() {
49        let entries = vec![
50            AddressBookEntry::new("bc1qtest1".to_string(), "BTC".to_string()),
51            AddressBookEntry::new("bc1qtest2".to_string(), "BTC".to_string()),
52        ];
53        let response = AddressBookResponse::new(entries);
54        assert_eq!(response.len(), 2);
55        assert!(!response.is_empty());
56    }
57
58    #[test]
59    fn test_address_book_response_default() {
60        let response = AddressBookResponse::default();
61        assert!(response.is_empty());
62        assert_eq!(response.len(), 0);
63    }
64
65    #[test]
66    fn test_address_book_response_serialization() {
67        let entries = vec![AddressBookEntry::new(
68            "0xtest".to_string(),
69            "ETH".to_string(),
70        )];
71        let response = AddressBookResponse::new(entries);
72
73        let json = serde_json::to_string(&response).unwrap();
74        assert!(json.contains("\"entries\""));
75        assert!(json.contains("\"address\":\"0xtest\""));
76    }
77
78    #[test]
79    fn test_address_book_response_deserialization() {
80        let json = r#"{
81            "entries": [
82                {
83                    "address": "bc1qtest",
84                    "currency": "BTC",
85                    "label": "Test wallet"
86                }
87            ]
88        }"#;
89
90        let response: AddressBookResponse = serde_json::from_str(json).unwrap();
91        assert_eq!(response.len(), 1);
92        assert_eq!(response.entries[0].address, "bc1qtest");
93        assert_eq!(response.entries[0].currency, "BTC");
94    }
95}