Skip to main content

coinbase_advanced/rest/
convert.rs

1//! Convert API endpoints.
2
3use crate::client::RestClient;
4use crate::error::Result;
5use crate::models::{
6    CommitConvertTradeRequest, ConvertTrade, ConvertTradeResponse, CreateConvertQuoteRequest,
7    GetConvertTradeParams,
8};
9
10/// API for currency conversion.
11///
12/// This API provides endpoints for creating conversion quotes, committing trades,
13/// and retrieving trade details.
14pub struct ConvertApi<'a> {
15    client: &'a RestClient,
16}
17
18impl<'a> ConvertApi<'a> {
19    /// Create a new Convert API instance.
20    pub(crate) fn new(client: &'a RestClient) -> Self {
21        Self { client }
22    }
23
24    /// Create a convert quote.
25    ///
26    /// This creates a quote for converting between two currencies. The quote
27    /// can then be committed to execute the conversion.
28    ///
29    /// # Example
30    ///
31    /// ```no_run
32    /// # use coinbase_advanced::{RestClient, Credentials, models::CreateConvertQuoteRequest};
33    /// # async fn example() -> coinbase_advanced::Result<()> {
34    /// let client = RestClient::builder()
35    ///     .credentials(Credentials::from_env()?)
36    ///     .build()?;
37    ///
38    /// let request = CreateConvertQuoteRequest::new(
39    ///     "USD-account-id",
40    ///     "USDC-account-id",
41    ///     "100.00",
42    /// );
43    ///
44    /// let quote = client.convert().create_quote(request).await?;
45    /// println!("Quote ID: {}", quote.id);
46    /// # Ok(())
47    /// # }
48    /// ```
49    pub async fn create_quote(&self, request: CreateConvertQuoteRequest) -> Result<ConvertTrade> {
50        let response: ConvertTradeResponse = self.client.post("/convert/quote", &request).await?;
51        Ok(response.trade)
52    }
53
54    /// Commit a convert trade.
55    ///
56    /// This executes a previously created conversion quote.
57    ///
58    /// # Example
59    ///
60    /// ```no_run
61    /// # use coinbase_advanced::{RestClient, Credentials, models::CommitConvertTradeRequest};
62    /// # async fn example() -> coinbase_advanced::Result<()> {
63    /// let client = RestClient::builder()
64    ///     .credentials(Credentials::from_env()?)
65    ///     .build()?;
66    ///
67    /// let request = CommitConvertTradeRequest::new(
68    ///     "USD-account-id",
69    ///     "USDC-account-id",
70    /// );
71    ///
72    /// let trade = client.convert().commit_trade("trade-id", request).await?;
73    /// println!("Trade status: {:?}", trade.status);
74    /// # Ok(())
75    /// # }
76    /// ```
77    pub async fn commit_trade(
78        &self,
79        trade_id: &str,
80        request: CommitConvertTradeRequest,
81    ) -> Result<ConvertTrade> {
82        let endpoint = format!("/convert/trade/{}", trade_id);
83        let response: ConvertTradeResponse = self.client.post(&endpoint, &request).await?;
84        Ok(response.trade)
85    }
86
87    /// Get a convert trade.
88    ///
89    /// # Example
90    ///
91    /// ```no_run
92    /// # use coinbase_advanced::{RestClient, Credentials, models::GetConvertTradeParams};
93    /// # async fn example() -> coinbase_advanced::Result<()> {
94    /// let client = RestClient::builder()
95    ///     .credentials(Credentials::from_env()?)
96    ///     .build()?;
97    ///
98    /// let params = GetConvertTradeParams::new(
99    ///     "USD-account-id",
100    ///     "USDC-account-id",
101    /// );
102    ///
103    /// let trade = client.convert().get_trade("trade-id", params).await?;
104    /// println!("Trade status: {:?}", trade.status);
105    /// # Ok(())
106    /// # }
107    /// ```
108    pub async fn get_trade(
109        &self,
110        trade_id: &str,
111        params: GetConvertTradeParams,
112    ) -> Result<ConvertTrade> {
113        let endpoint = format!("/convert/trade/{}", trade_id);
114        let response: ConvertTradeResponse = self
115            .client
116            .get_with_query(&endpoint, &params)
117            .await?;
118        Ok(response.trade)
119    }
120}