Skip to main content

neon_wasi_http/
transaction_builder.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{Client, Query, TransactionResponse};
4use anyhow::Result;
5
6#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct Transaction {
8    pub queries: Vec<Query>,
9}
10
11//TODO: Add support for Transaction Options https://github.com/neondatabase/serverless/blob/e4d6b4bde81d56ea7597d7c43c97c3695647fc0e/export/httpQuery.ts#L233
12#[derive(Default)]
13pub struct TransactionBuilder {
14    queries: Vec<Query>,
15}
16
17impl TransactionBuilder {
18    pub fn new() -> Self {
19        Self::default()
20    }
21
22    pub fn add(mut self, query: Query) -> Self {
23        self.queries.push(query);
24        self
25    }
26
27    pub fn merge(mut self, mut transaction: Transaction) -> Self {
28        self.queries.append(&mut transaction.queries);
29        self
30    }
31
32    pub fn build(self) -> Transaction {
33        self.into()
34    }
35
36    pub async fn execute(self, connection: &Client) -> Result<()> {
37        connection.execute_transaction(self.build()).await
38    }
39
40    pub async fn execute_raw(self, connection: &Client) -> Result<TransactionResponse> {
41        connection.execute_transaction_raw(self.build()).await
42    }
43}
44
45impl From<TransactionBuilder> for Transaction {
46    fn from(value: TransactionBuilder) -> Self {
47        Self {
48            queries: value.queries,
49        }
50    }
51}