db_http_core/
query_builder.rs1use 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}