1use serde::de::Deserializer;
10use serde::{Deserialize, Serialize};
11
12pub mod generated {
17 pub mod tdx {
19 pub mod volt_api {
20 pub mod volt {
21 pub mod v1 {
22 include!(concat!(env!("OUT_DIR"), "/tdx.volt_api.volt.v1.rs"));
23 }
24 }
25 pub mod data {
26 pub mod v1 {
27 include!(concat!(env!("OUT_DIR"), "/tdx.volt_api.data.v1.rs"));
28 }
29 }
30 pub mod relay {
31 pub mod v1 {
32 include!(concat!(env!("OUT_DIR"), "/tdx.volt_api.relay.v1.rs"));
33 }
34 }
35 pub mod proto_db_sync {
36 pub mod v1 {
37 include!(concat!(
38 env!("OUT_DIR"),
39 "/tdx.volt_api.proto_db_sync.v1.rs"
40 ));
41 }
42 }
43 }
44 }
45}
46
47pub use generated::tdx::volt_api::data::v1 as data;
49pub use generated::tdx::volt_api::proto_db_sync::v1 as proto_db_sync;
50pub use generated::tdx::volt_api::relay::v1 as relay;
51pub use generated::tdx::volt_api::volt::v1 as volt;
52
53pub use data::sqlite_database_api_client::SqliteDatabaseApiClient;
55pub use data::sqlite_server_api_client::SqliteServerApiClient;
56pub use relay::relay_api_client::RelayApiClient;
57pub use volt::sync_api_client::SyncApiClient;
58pub use volt::volt_api_client::VoltApiClient;
59
60#[derive(Debug, Clone, Default, Serialize, Deserialize)]
67pub struct Status {
68 #[serde(default)]
70 pub code: i32,
71 #[serde(default)]
73 pub message: String,
74 #[serde(default)]
76 pub description: Option<String>,
77}
78
79impl Status {
80 pub fn is_ok(&self) -> bool {
81 self.code == 0 && self.message.is_empty()
82 }
83
84 pub fn ok() -> Self {
85 Self::default()
86 }
87
88 pub fn error(code: i32, message: impl Into<String>) -> Self {
89 Self {
90 code,
91 message: message.into(),
92 description: None,
93 }
94 }
95}
96
97#[derive(Debug, Clone, Default, Serialize, Deserialize)]
99pub struct ConnectHello {
100 #[serde(default)]
102 pub ping_interval: u64,
103 #[serde(default)]
105 pub timestamp: u64,
106}
107
108#[derive(Debug, Clone, Default, Serialize, Deserialize)]
110pub struct ConnectRequest {
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub hello: Option<ConnectHello>,
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub ping: Option<PingMessage>,
117}
118
119#[derive(Debug, Clone, Default, Serialize, Deserialize)]
121pub struct PingMessage {
122 pub timestamp: u64,
124}
125
126#[derive(Debug, Clone, Default, Serialize, Deserialize)]
128pub struct ConnectAcknowledge {
129 pub connection_id: String,
131 pub ping_interval: u64,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137#[serde(tag = "payload")]
138pub enum ConnectResponsePayload {
139 #[serde(rename = "ping")]
140 Ping(PingMessage),
141 #[serde(rename = "acknowledge")]
142 Acknowledge(ConnectAcknowledge),
143 #[serde(rename = "invoke_request")]
144 InvokeRequest(InvokeRequest),
145 #[serde(rename = "evt")]
146 Event(serde_json::Value),
147}
148
149#[derive(Debug, Clone, Default, Serialize, Deserialize)]
151pub struct InvokeRequest {
152 pub invoke_id: String,
154 #[serde(flatten)]
156 pub payload: serde_json::Value,
157}
158
159#[derive(Debug, Clone, Default, Serialize, Deserialize)]
161pub struct AuthenticateRequest {
162 pub client_name: String,
164 #[serde(default)]
166 pub host: Option<String>,
167 #[serde(default)]
169 pub public_key: Option<String>,
170 #[serde(default)]
172 pub did_public_key: Option<String>,
173 #[serde(default)]
175 pub did: Option<String>,
176 #[serde(default)]
178 pub did_document: Option<String>,
179 #[serde(default)]
181 pub did_document_signature: Option<String>,
182 #[serde(default)]
184 pub challenge: Option<String>,
185 #[serde(default)]
187 pub exchange_token: Option<String>,
188 #[serde(default)]
190 pub verifiable_presentation: Vec<VerifiablePresentation>,
191}
192
193#[derive(Debug, Clone, Default, Serialize, Deserialize)]
195pub struct VerifiablePresentation {
196 pub credential: Vec<String>,
198 pub signature: String,
200}
201
202#[derive(Debug, Clone, Default, Serialize, Deserialize)]
204pub struct AuthenticateResponse {
205 #[serde(default)]
207 pub status: Option<Status>,
208 #[serde(default, deserialize_with = "string_or_default")]
210 pub decision: String,
211 #[serde(default)]
213 pub cert: Option<String>,
214 #[serde(default)]
216 pub chain: Option<String>,
217 #[serde(default)]
219 pub session_id: Option<String>,
220 #[serde(default)]
222 pub identity_did: Option<String>,
223 #[serde(default)]
225 pub credential: Vec<String>,
226}
227
228#[derive(Debug, Clone, Default, Serialize, Deserialize)]
230pub struct ResourceRequest {
231 pub resource_id: String,
233}
234
235fn string_or_default<'de, D>(deserializer: D) -> Result<String, D::Error>
236where
237 D: Deserializer<'de>,
238{
239 Ok(Option::<String>::deserialize(deserializer)?.unwrap_or_default())
240}
241
242#[derive(Debug, Clone, Default, Serialize, Deserialize)]
244pub struct AccessRequest {
245 pub resource_id: String,
247 pub access: String,
249}
250
251#[derive(Debug, Clone, Default, Serialize, Deserialize)]
253pub struct AccessResponse {
254 #[serde(default)]
256 pub status: Option<Status>,
257 pub decision: String,
259}
260
261#[derive(Debug, Clone, Default, Serialize, Deserialize)]
263pub struct ApiResponse {
264 #[serde(default)]
266 pub status: Option<Status>,
267 #[serde(flatten)]
269 pub payload: serde_json::Value,
270}
271
272impl ApiResponse {
273 pub fn is_ok(&self) -> bool {
274 self.status.as_ref().map(|s| s.is_ok()).unwrap_or(true)
275 }
276
277 pub fn error_message(&self) -> Option<&str> {
278 self.status
279 .as_ref()
280 .filter(|s| !s.is_ok())
281 .map(|s| s.message.as_str())
282 }
283}
284
285#[derive(Debug, Clone, Default, Serialize, Deserialize)]
287pub struct SqlExecuteStart {
288 pub database_id: String,
290 #[serde(default)]
292 pub transaction: bool,
293 pub statement: String,
295 #[serde(default)]
297 pub page_size: Option<u32>,
298}
299
300#[derive(Debug, Clone, Serialize, Deserialize)]
302pub struct SqlExecuteRequest {
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub start: Option<SqlExecuteStart>,
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub next: Option<bool>,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub commit: Option<bool>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub rollback: Option<bool>,
315}
316
317#[derive(Debug, Clone, Default, Serialize, Deserialize)]
319pub struct SqlColumn {
320 pub name: String,
322 #[serde(default)]
324 pub description: Option<String>,
325 #[serde(rename = "type")]
327 pub column_type: String,
328}
329
330#[derive(Debug, Clone, Default, Serialize, Deserialize)]
332pub struct SqlRowHeader {
333 pub column: Vec<SqlColumn>,
335}
336
337#[derive(Debug, Clone, Serialize, Deserialize)]
339#[serde(rename_all = "snake_case")]
340pub enum SqlVariant {
341 Text(String),
342 Integer(i64),
343 Real(f64),
344 Blob(Vec<u8>),
345 Null(bool),
346}
347
348#[derive(Debug, Clone, Default, Serialize, Deserialize)]
350pub struct SqlVariantRow {
351 pub column: Vec<SqlVariant>,
353}
354
355#[derive(Debug, Clone, Serialize, Deserialize)]
357pub struct SqlExecuteResponse {
358 #[serde(default)]
360 pub status: Option<Status>,
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub header: Option<SqlRowHeader>,
364 #[serde(skip_serializing_if = "Option::is_none")]
366 pub row: Option<SqlVariantRow>,
367}
368
369#[derive(Debug, Clone, Default, Serialize, Deserialize)]
371pub struct DownloadFileRequest {
372 pub resource_id: String,
374}
375
376#[derive(Debug, Clone, Serialize, Deserialize)]
378pub struct DownloadFileResponse {
379 #[serde(default)]
381 pub status: Option<Status>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub block: Option<Vec<u8>>,
385}