Skip to main content

db_http_core/
query_builder.rs

1use crate::backend::DatabaseBackend;
2use crate::deserializer::{deserialize_all, deserialize_one};
3use crate::error::Error;
4use crate::types::{Query, QueryResult};
5use serde::de::DeserializeOwned;
6
7pub struct QueryBuilder<B: DatabaseBackend> {
8    backend: B,
9    sql: String,
10    params: Vec<serde_json::Value>,
11}
12
13impl<B: DatabaseBackend> QueryBuilder<B> {
14    pub fn new(backend: B, sql: impl Into<String>) -> Self {
15        Self {
16            backend,
17            sql: sql.into(),
18            params: Vec::new(),
19        }
20    }
21
22    pub fn bind(mut self, value: impl Into<serde_json::Value>) -> Self {
23        self.params.push(value.into());
24        self
25    }
26
27    pub fn build(self) -> Query {
28        Query {
29            sql: self.sql,
30            params: self.params,
31        }
32    }
33
34    pub async fn fetch_one<T: DeserializeOwned>(self) -> Result<T, Error> {
35        let query = Query {
36            sql: self.sql,
37            params: self.params,
38        };
39        let result = self.backend.execute_query(&query).await?;
40        deserialize_one(result)
41    }
42
43    pub async fn fetch_all<T: DeserializeOwned>(self) -> Result<Vec<T>, Error> {
44        let query = Query {
45            sql: self.sql,
46            params: self.params,
47        };
48        let result = self.backend.execute_query(&query).await?;
49        deserialize_all(result)
50    }
51
52    pub async fn execute(self) -> Result<QueryResult, Error> {
53        let query = Query {
54            sql: self.sql,
55            params: self.params,
56        };
57        self.backend.execute_query(&query).await
58    }
59}