1use serde::{Deserialize, Serialize};
2
3use crate::client::Client;
4use crate::error::Result;
5
6#[derive(Debug, Clone, Serialize, Default)]
8pub struct CreateKeyRequest {
9 pub name: String,
11
12 #[serde(skip_serializing_if = "Option::is_none")]
14 pub endpoints: Option<Vec<String>>,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub spend_cap_usd: Option<f64>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub rate_limit: Option<i32>,
23}
24
25#[derive(Debug, Clone, Deserialize)]
27pub struct KeyDetails {
28 pub id: String,
30
31 pub name: String,
33
34 pub key_prefix: String,
36
37 #[serde(default)]
39 pub scope: Option<serde_json::Value>,
40
41 #[serde(default)]
43 pub spent_ticks: i64,
44
45 #[serde(default)]
47 pub revoked: bool,
48
49 #[serde(default)]
51 pub created_at: Option<String>,
52
53 #[serde(default)]
55 pub last_used: Option<String>,
56}
57
58#[derive(Debug, Clone, Deserialize)]
60pub struct CreateKeyResponse {
61 pub key: String,
63
64 pub details: KeyDetails,
66}
67
68#[derive(Debug, Clone, Deserialize)]
70pub struct ListKeysResponse {
71 pub keys: Vec<KeyDetails>,
73}
74
75#[derive(Debug, Clone, Deserialize)]
77pub struct StatusResponse {
78 pub status: String,
80
81 #[serde(default)]
83 pub message: Option<String>,
84}
85
86impl Client {
87 pub async fn create_key(&self, req: &CreateKeyRequest) -> Result<CreateKeyResponse> {
89 let (resp, _meta) = self
90 .post_json::<CreateKeyRequest, CreateKeyResponse>("/qai/v1/keys", req)
91 .await?;
92 Ok(resp)
93 }
94
95 pub async fn list_keys(&self) -> Result<ListKeysResponse> {
97 let (resp, _meta) = self.get_json::<ListKeysResponse>("/qai/v1/keys").await?;
98 Ok(resp)
99 }
100
101 pub async fn revoke_key(&self, id: &str) -> Result<StatusResponse> {
103 let path = format!("/qai/v1/keys/{id}");
104 let (resp, _meta) = self.delete_json::<StatusResponse>(&path).await?;
105 Ok(resp)
106 }
107}