diff options
Diffstat (limited to '')
| -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>, | 
