postgres_types_extra/
pg_xml.rs

1use std::{error::Error, fmt};
2
3use bytes::{BufMut, BytesMut};
4use postgres_types::{FromSql, IsNull, ToSql, Type, accepts, to_sql_checked};
5
6#[derive(Debug, Clone)]
7pub struct PgXml(String);
8
9impl FromSql<'_> for PgXml {
10    fn from_sql(ty: &Type, raw: &[u8]) -> Result<Self, Box<dyn Error + Sync + Send>> {
11        if ty.name() != "xml" {
12            return Err("Unexpected type".into());
13        }
14        let xml = String::from_utf8(raw.to_vec())?;
15        Ok(PgXml(xml))
16    }
17
18    accepts!(XML);
19}
20
21impl fmt::Display for PgXml {
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        // write!(f, "XML: {}", self.0)
24        write!(f, "{}", self.0)
25    }
26}
27
28impl ToSql for PgXml {
29    fn to_sql(
30        &self,
31        ty: &Type,
32        out: &mut BytesMut,
33    ) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
34        if ty.name() != "xml" {
35            return Err("Unexpected type".into());
36        }
37        out.put_slice(self.0.as_bytes());
38        Ok(IsNull::No)
39    }
40
41    accepts!(XML);
42
43    to_sql_checked!();
44}