deribit_http/message/
request.rs

1//! HTTP request message handling
2
3use crate::model::request::api_request::HttpRequest;
4use crate::model::types::RequestParams;
5use pretty_simple_display::{DebugPretty, DisplaySimple};
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9/// Request builder for HTTP messages
10#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
11pub struct HttpRequestBuilder {
12    base_url: String,
13}
14
15impl HttpRequestBuilder {
16    /// Create a new request builder
17    pub fn new(base_url: String) -> Self {
18        Self { base_url }
19    }
20
21    /// Build a GET request
22    pub fn build_get(&self, endpoint: &str, params: Option<RequestParams>) -> HttpRequest {
23        let mut url = format!("{}{}", self.base_url, endpoint);
24
25        if let Some(params) = params
26            && !params.is_empty()
27        {
28            // Convert params to query string
29            let query_string = self.params_to_query_string(&params);
30            url.push('?');
31            url.push_str(&query_string);
32        }
33
34        HttpRequest {
35            method: "GET".to_string(),
36            endpoint: url,
37            headers: self.default_headers(),
38            body: None,
39        }
40    }
41
42    /// Build a POST request
43    pub fn build_post(&self, endpoint: &str, params: Option<RequestParams>) -> HttpRequest {
44        let url = format!("{}{}", self.base_url, endpoint);
45        let body = params.map(|p| p.to_json().to_string());
46
47        HttpRequest {
48            method: "POST".to_string(),
49            endpoint: url,
50            headers: self.default_headers(),
51            body,
52        }
53    }
54
55    /// Build authentication request
56    pub fn build_auth_request(&self, client_id: &str, client_secret: &str) -> HttpRequest {
57        let params = RequestParams::new()
58            .add("grant_type", "client_credentials")
59            .add("client_id", client_id)
60            .add("client_secret", client_secret);
61
62        self.build_post("/public/auth", Some(params))
63    }
64
65    /// Build test request
66    pub fn build_test_request(&self) -> HttpRequest {
67        self.build_get("/public/test", None)
68    }
69
70    /// Build get time request
71    pub fn build_get_time_request(&self) -> HttpRequest {
72        self.build_get("/public/get_time", None)
73    }
74
75    /// Get default headers
76    fn default_headers(&self) -> HashMap<String, String> {
77        let mut headers = HashMap::new();
78        headers.insert("Content-Type".to_string(), "application/json".to_string());
79        headers.insert("Accept".to_string(), "application/json".to_string());
80        headers
81    }
82
83    /// Convert parameters to query string
84    fn params_to_query_string(&self, _params: &RequestParams) -> String {
85        // TODO: Implement proper query string conversion
86        String::new()
87    }
88}