serde_pgrow/
pg_row_ext.rs1use ::serde::Deserialize;
2
3use crate::de::DeRow;
4use crate::de::PgDeError;
5use crate::pg::*;
6
7pub trait PgRowExt {
8 fn cast<'de, T>(&self) -> Result<T, PgDeError>
9 where
10 T: Deserialize<'de>;
11}
12
13impl PgRowExt for PgRow {
14 fn cast<'de, T>(&self) -> Result<T, PgDeError>
15 where
16 T: Deserialize<'de>,
17 {
18 #[cfg(feature = "debug-logs")]
19 log::trace!("PgRowExt::cast<'de, {}>", std::any::type_name::<T>());
20
21 let de = DeRow::new(self);
22 ::serde::Deserialize::deserialize(de)
23 }
24}
25
26pub trait PgRowOptionExt {
27 fn cast<'de, T>(&self) -> Result<Option<T>, PgDeError>
28 where
29 T: Deserialize<'de>;
30}
31
32impl PgRowOptionExt for Option<&PgRow> {
33 fn cast<'de, T>(&self) -> Result<Option<T>, PgDeError>
34 where
35 T: Deserialize<'de>,
36 {
37 self.as_ref().map(|r| r.cast()).transpose()
38 }
39}
40
41pub trait PgSeqExt {
42 fn cast<'de, T>(&self) -> Result<Vec<T>, PgDeError>
43 where
44 T: Deserialize<'de>;
45}
46
47impl PgSeqExt for Vec<PgRow> {
48 fn cast<'de, T>(&self) -> Result<Vec<T>, PgDeError>
49 where
50 T: Deserialize<'de>,
51 {
52 self.iter().map(|r| r.cast()).collect()
53 }
54}