postgres_types_extra/
pg_xml.rs1use 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, "{}", 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}