edgedb_tokio_ext/
serde_ext.rs

1use 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}