diff options
Diffstat (limited to 'jid/src/lib.rs')
-rw-r--r-- | jid/src/lib.rs | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/jid/src/lib.rs b/jid/src/lib.rs index ff1d82b..5b648d9 100644 --- a/jid/src/lib.rs +++ b/jid/src/lib.rs @@ -1,6 +1,8 @@ -use std::str::FromStr; +use std::{error::Error, fmt::Display, str::FromStr}; -#[derive(PartialEq, Debug, Clone)] +use sqlx::Sqlite; + +#[derive(PartialEq, Debug, Clone, sqlx::Type, sqlx::Encode)] pub struct JID { // TODO: validate localpart (length, char] pub localpart: Option<String>, @@ -8,6 +10,33 @@ pub struct JID { pub resourcepart: Option<String>, } +// TODO: feature gate +impl sqlx::Type<Sqlite> for JID { + fn type_info() -> <Sqlite as sqlx::Database>::TypeInfo { + <&str as sqlx::Type<Sqlite>>::type_info() + } +} + +impl sqlx::Decode<'_, Sqlite> for JID { + fn decode( + value: <Sqlite as sqlx::Database>::ValueRef<'_>, + ) -> Result<Self, sqlx::error::BoxDynError> { + let value = <&str as sqlx::Decode<Sqlite>>::decode(value)?; + + Ok(value.parse()?) + } +} + +impl sqlx::Encode<'_, Sqlite> for JID { + fn encode_by_ref( + &self, + buf: &mut <Sqlite as sqlx::Database>::ArgumentBuffer<'_>, + ) -> Result<sqlx::encode::IsNull, sqlx::error::BoxDynError> { + let jid = self.to_string(); + <String as sqlx::Encode<Sqlite>>::encode(jid, buf) + } +} + pub enum JIDError { NoResourcePart, ParseError(ParseError), @@ -19,6 +48,19 @@ pub enum ParseError { Malformed(String), } +impl Display for ParseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ParseError::Empty => f.write_str("JID parse error: Empty"), + ParseError::Malformed(j) => { + f.write_str(format!("JID parse error: malformed; got '{}'", j).as_str()) + } + } + } +} + +impl Error for ParseError {} + impl JID { pub fn new( localpart: Option<String>, |