serde_pgrow/
pg_row_ext.rs

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