Skip to main content

quantum_sdk/
contact.rs

1use reqwest::header::CONTENT_TYPE;
2use serde::Serialize;
3
4use crate::client::Client;
5use crate::error::Result;
6use crate::keys::StatusResponse;
7
8/// Request body for the public contact form.
9#[derive(Debug, Clone, Serialize, Default)]
10pub struct ContactRequest {
11    /// Sender name.
12    pub name: String,
13
14    /// Sender email address.
15    pub email: String,
16
17    /// Message subject.
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub subject: Option<String>,
20
21    /// Message body.
22    pub message: String,
23}
24
25impl Client {
26    /// Sends a contact form message.
27    ///
28    /// This endpoint does not require authentication. A separate HTTP client
29    /// is used to avoid sending API key headers.
30    pub async fn contact(&self, req: &ContactRequest) -> Result<StatusResponse> {
31        let url = format!("{}/qai/v1/contact", self.base_url());
32
33        let http = reqwest::Client::new();
34        let resp = http
35            .post(&url)
36            .header(CONTENT_TYPE, "application/json")
37            .json(req)
38            .send()
39            .await?;
40
41        if !resp.status().is_success() {
42            let status_code = resp.status().as_u16();
43            let body = resp.text().await.unwrap_or_default();
44            return Err(crate::error::Error::Api(crate::error::ApiError {
45                status_code,
46                code: "contact_error".to_string(),
47                message: body,
48                request_id: String::new(),
49            }));
50        }
51
52        let result: StatusResponse = resp.json().await?;
53        Ok(result)
54    }
55}