edgedb_tokio_ext/
serde_ext.rs1use async_trait::async_trait;
2use edgedb_errors::ErrorKind;
3use edgedb_protocol::query_arg::QueryArgs;
4
5#[async_trait]
6pub trait SerdeClientExt {
7 async fn query_required_single_serde<T>(
8 &self,
9 query: &str,
10 args: &impl QueryArgs,
11 ) -> Result<T, edgedb_tokio::Error>
12 where
13 T: serde::de::DeserializeOwned;
14
15 async fn query_serde<T>(
16 &self,
17 query: &str,
18 args: &impl QueryArgs,
19 ) -> Result<T, edgedb_tokio::Error>
20 where
21 T: serde::de::DeserializeOwned;
22
23 async fn query_single_serde<T>(
24 &self,
25 query: &str,
26 args: &impl QueryArgs,
27 ) -> Result<Option<T>, edgedb_tokio::Error>
28 where
29 T: serde::de::DeserializeOwned;
30}
31
32#[async_trait]
33impl SerdeClientExt for edgedb_tokio::Client {
34 async fn query_required_single_serde<T>(
35 &self,
36 query: &str,
37 args: &impl QueryArgs,
38 ) -> Result<T, edgedb_tokio::Error>
39 where
40 T: serde::de::DeserializeOwned,
41 {
42 let json = self.query_required_single_json(query, args).await?;
43 serde_json::from_str(&json).map_err(edgedb_errors::UserError::with_source)
44 }
45
46 async fn query_serde<T>(
47 &self,
48 query: &str,
49 args: &impl QueryArgs,
50 ) -> Result<T, edgedb_tokio::Error>
51 where
52 T: serde::de::DeserializeOwned,
53 {
54 let json = self.query_json(query, args).await?;
55 serde_json::from_str(&json).map_err(edgedb_errors::UserError::with_source)
56 }
57
58 async fn query_single_serde<T>(
59 &self,
60 query: &str,
61 args: &impl QueryArgs,
62 ) -> Result<Option<T>, edgedb_tokio::Error>
63 where
64 T: serde::de::DeserializeOwned,
65 {
66 let json_opt = self.query_single_json(query, args).await?;
67 json_opt
68 .map(|json| serde_json::from_str(&json).map_err(edgedb_errors::UserError::with_source))
69 .transpose()
70 }
71}
72
73#[async_trait(?Send)]
74pub trait SerdeTrxExt {
75 async fn query_required_single_serde<T>(
76 &mut self,
77 query: &str,
78 args: &impl QueryArgs,
79 ) -> Result<T, edgedb_tokio::Error>
80 where
81 T: serde::de::DeserializeOwned;
82
83 async fn query_serde<T>(
84 &mut self,
85 query: &str,
86 args: &impl QueryArgs,
87 ) -> Result<T, edgedb_tokio::Error>
88 where
89 T: serde::de::DeserializeOwned;
90
91 async fn query_single_serde<T>(
92 &mut self,
93 query: &str,
94 args: &impl QueryArgs,
95 ) -> Result<Option<T>, edgedb_tokio::Error>
96 where
97 T: serde::de::DeserializeOwned;
98}
99
100#[async_trait(?Send)]
101impl SerdeTrxExt for edgedb_tokio::Transaction {
102 async fn query_required_single_serde<T>(
103 &mut self,
104 query: &str,
105 args: &impl QueryArgs,
106 ) -> Result<T, edgedb_tokio::Error>
107 where
108 T: serde::de::DeserializeOwned,
109 {
110 let json = self.query_required_single_json(query, args).await?;
111 serde_json::from_str(&json).map_err(edgedb_errors::UserError::with_source)
112 }
113
114 async fn query_serde<T>(
115 &mut self,
116 query: &str,
117 args: &impl QueryArgs,
118 ) -> Result<T, edgedb_tokio::Error>
119 where
120 T: serde::de::DeserializeOwned,
121 {
122 let json = self.query_json(query, args).await?;
123 serde_json::from_str(&json).map_err(edgedb_errors::UserError::with_source)
124 }
125
126 async fn query_single_serde<T>(
127 &mut self,
128 query: &str,
129 args: &impl QueryArgs,
130 ) -> Result<Option<T>, edgedb_tokio::Error>
131 where
132 T: serde::de::DeserializeOwned,
133 {
134 let json_opt = self.query_single_json(query, args).await?;
135 json_opt
136 .map(|json| serde_json::from_str(&json).map_err(edgedb_errors::UserError::with_source))
137 .transpose()
138 }
139}