Atproto, add sqlx support

This commit is contained in:
Julia Lange 2025-06-16 15:54:20 -07:00
parent 781a56028f
commit 0573e1aa43
Signed by: Julia
SSH key fingerprint: SHA256:5DJcfxa5/fKCYn57dcabJa2vN2e6eT0pBerYi5SUbto
6 changed files with 102 additions and 1 deletions

View file

@ -1,3 +1,5 @@
pub mod lexicons;
pub mod types;
pub mod error;
#[cfg(feature = "sqlx-support")]
pub mod sqlx;

38
atproto/src/sqlx.rs Normal file
View file

@ -0,0 +1,38 @@
use crate::types::{
Did,
Cid,
Uri,
Handle,
Datetime,
};
macro_rules! implement_sqlx_for_string_type {
($name:ident) => {
impl sqlx::Type<sqlx::Postgres> for $name {
fn type_info() -> sqlx::postgres::PgTypeInfo {
<String as sqlx::Type<sqlx::Postgres>>::type_info()
}
}
impl<'q> sqlx::Encode<'q, sqlx::Postgres> for $name {
fn encode_by_ref(
&self, buf: &mut sqlx::postgres::PgArgumentBuffer
) -> Result<sqlx::encode::IsNull, sqlx::error::BoxDynError> {
<String as sqlx::Encode<sqlx::Postgres>>::encode_by_ref(&self.to_string(), buf)
}
}
impl<'r> sqlx::Decode<'r, sqlx::Postgres> for $name {
fn decode(
value: sqlx::postgres::PgValueRef<'r>
) -> Result<Self, sqlx::error::BoxDynError> {
let s = <String as sqlx::Decode<sqlx::Postgres>>::decode(value)?;
s.parse::<$name>().map_err(|e| Box::new(e) as sqlx::error::BoxDynError)
}
}
}
}
implement_sqlx_for_string_type!(Did);
implement_sqlx_for_string_type!(Cid);
implement_sqlx_for_string_type!(Uri);
implement_sqlx_for_string_type!(Handle);
implement_sqlx_for_string_type!(Datetime);