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, ¶ms)
117 .await?;
118 Ok(response.trade)
119 }
120}