diff --git a/sqlx-sqlite/src/types/mod.rs b/sqlx-sqlite/src/types/mod.rs index d36af7ea14..190b089cff 100644 --- a/sqlx-sqlite/src/types/mod.rs +++ b/sqlx-sqlite/src/types/mod.rs @@ -236,5 +236,6 @@ mod text; #[cfg(feature = "time")] mod time; mod uint; +mod url; #[cfg(feature = "uuid")] mod uuid; diff --git a/sqlx-sqlite/src/types/url.rs b/sqlx-sqlite/src/types/url.rs new file mode 100644 index 0000000000..0ca756648d --- /dev/null +++ b/sqlx-sqlite/src/types/url.rs @@ -0,0 +1,35 @@ +use crate::arguments::SqliteArgumentsBuffer; +use crate::decode::Decode; +use crate::encode::{Encode, IsNull}; +use crate::error::BoxDynError; +use crate::type_info::DataType; +use crate::types::Type; +use crate::{Sqlite, SqliteArgumentValue, SqliteTypeInfo, SqliteValueRef}; +use std::sync::Arc; +use url::Url; + +impl Type for Url { + fn type_info() -> SqliteTypeInfo { + SqliteTypeInfo(DataType::Text) + } + + fn compatible(ty: &SqliteTypeInfo) -> bool { + matches!(ty.0, DataType::Text) + } +} + +impl Encode<'_, Sqlite> for Url { + fn encode_by_ref(&self, args: &mut SqliteArgumentsBuffer) -> Result { + args.push(SqliteArgumentValue::Text(Arc::new( + self.as_str().to_string(), + ))); + + Ok(IsNull::No) + } +} + +impl Decode<'_, Sqlite> for Url { + fn decode(value: SqliteValueRef<'_>) -> Result { + Url::parse(value.text_borrowed()?).map_err(Into::into) + } +} diff --git a/tests/sqlite/types.rs b/tests/sqlite/types.rs index 52531b41c6..6e6762db7c 100644 --- a/tests/sqlite/types.rs +++ b/tests/sqlite/types.rs @@ -11,6 +11,7 @@ use std::borrow::Cow; use std::net::SocketAddr; use std::rc::Rc; use std::sync::Arc; +use url::Url; test_type!(null>(Sqlite, "NULL" == None:: @@ -218,6 +219,8 @@ test_type!(test_cow_slice>(Sqlite, "X'01020304'" == Cow::<'static, test_type!(test_arc_slice>(Sqlite, "X'01020304'" == Arc::<[u8]>::from([1,2,3,4]))); test_type!(test_rc_slice>(Sqlite, "X'01020304'" == Rc::<[u8]>::from([1,2,3,4]))); +test_type!(test_url(Sqlite, "'https://example.com/'" == Url::parse("https://example.com/").unwrap())); + #[sqlx_macros::test] async fn test_text_adapter() -> anyhow::Result<()> { #[derive(sqlx::FromRow, Debug, PartialEq, Eq)]