neon_wasi_http/
query_builder.rs1use anyhow::{Result, bail};
2use serde::{Deserialize, Serialize, de::DeserializeOwned};
3
4use crate::{Client, QueryResponse};
5
6#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct Query {
8 pub query: String,
9 pub params: Vec<serde_json::Value>,
10}
11
12pub struct QueryBuilder {
13 query: String,
14 params: Vec<serde_json::Value>,
15}
16
17impl QueryBuilder {
18 pub fn new(query: &str) -> Self {
19 Self {
20 query: query.to_string(),
21 params: Vec::new(),
22 }
23 }
24
25 pub fn set_sql(mut self, sql: &str) -> Self {
26 self.query = sql.to_string();
27 self
28 }
29
30 pub fn bind<T: Serialize>(mut self, value: T) -> Self {
31 let val = serde_json::to_value(&value).unwrap();
32 if !val.is_null() {
33 if let serde_json::Value::Object(_) | serde_json::Value::Array(_) = &val {
34 let json_string = serde_json::to_string(&val).unwrap();
35 self.params.push(serde_json::Value::String(json_string));
36 } else {
37 self.params.push(val);
38 }
39 } else {
40 self.params.push(serde_json::Value::Null);
41 }
42
43 self
44 }
45
46 pub fn build(self) -> Query {
47 self.into()
48 }
49
50 pub async fn execute(self, connection: &Client) -> Result<()> {
51 connection.execute(self.build()).await
52 }
53
54 pub async fn execute_raw(self, connection: &Client, is_select: bool) -> Result<QueryResponse> {
55 connection.execute_raw(self.build(), is_select).await
56 }
57
58 pub async fn fetch_one<T>(self, conn: &Client) -> Result<Option<T>>
59 where
60 T: DeserializeOwned,
61 {
62 match self.execute_raw(conn, true).await? {
63 QueryResponse::Ok(mut query_response) => Ok(query_response.deserialize()?),
64 QueryResponse::Err(neon_error) => bail!(neon_error),
65 }
66 }
67
68 pub async fn fetch_all<T>(self, conn: &Client) -> Result<Vec<T>>
69 where
70 T: DeserializeOwned,
71 {
72 match self.execute_raw(conn, true).await? {
73 QueryResponse::Ok(mut query_response) => Ok(query_response.deserialize_multiple()?),
74 QueryResponse::Err(neon_error) => bail!(neon_error),
75 }
76 }
77}
78
79impl From<QueryBuilder> for Query {
80 fn from(value: QueryBuilder) -> Self {
81 Self {
82 query: value.query,
83 params: value.params,
84 }
85 }
86}