charybdis 1.1.0

High-Performance ORM for ScyllaDB
Documentation
use charybdis::scylla::serialize::writers::CellWriter;
use charybdis::scylla::SerializeValue;
use charybdis::types::Text;
use scylla::deserialize::value::DeserializeValue;
use scylla::deserialize::{DeserializationError, FrameSlice, TypeCheckError};
use scylla::frame::response::result::ColumnType;
use scylla::serialize::writers::WrittenCellProof;
use scylla::serialize::SerializationError;

#[derive(Debug, Default, Clone, PartialEq, strum::FromRepr)]
#[repr(i8)]
pub enum AddressTypeCustomField {
    #[default]
    HomeAddress = 0,
    WorkAddress = 1,
}

#[derive(Debug)]
struct AddressTypeCustomDeserializeErr(i8);
impl std::fmt::Display for AddressTypeCustomDeserializeErr {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "AddressTypeCustomDeserializeErr({})", self.0)
    }
}
impl std::error::Error for AddressTypeCustomDeserializeErr {}

impl<'frame, 'metadata> DeserializeValue<'frame, 'metadata> for AddressTypeCustomField {
    fn type_check(typ: &ColumnType) -> Result<(), TypeCheckError> {
        <i8 as DeserializeValue<'frame, 'metadata>>::type_check(typ)
    }

    fn deserialize(
        typ: &'metadata ColumnType<'metadata>,
        v: Option<FrameSlice<'frame>>,
    ) -> Result<Self, DeserializationError> {
        let si8 = <i8 as DeserializeValue<'frame, 'metadata>>::deserialize(typ, v)?;
        let s = Self::from_repr(si8);
        s.ok_or_else(|| DeserializationError::new(AddressTypeCustomDeserializeErr(si8)))
    }
}

impl SerializeValue for AddressTypeCustomField {
    fn serialize<'b>(
        &self,
        typ: &ColumnType,
        writer: CellWriter<'b>,
    ) -> Result<WrittenCellProof<'b>, SerializationError> {
        let disc = self.clone() as i8;

        let v = <i8 as SerializeValue>::serialize(&disc, typ, writer)?;
        Ok(v)
    }
}

#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct UserExtraDataCustomField {
    pub user_tags: Vec<(String, String)>,
}

impl Default for UserExtraDataCustomField {
    fn default() -> Self {
        Self {
            user_tags: vec![("some_key".to_string(), "some_value".to_string())],
        }
    }
}

#[derive(Debug)]
struct UserExtraDataDeserializeErr(String);
impl std::fmt::Display for UserExtraDataDeserializeErr {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "UserExtraDataDeserializeErr({})", self.0)
    }
}
impl std::error::Error for UserExtraDataDeserializeErr {}

impl<'frame, 'metadata> DeserializeValue<'frame, 'metadata> for UserExtraDataCustomField {
    fn type_check(typ: &ColumnType) -> Result<(), TypeCheckError> {
        <Text as DeserializeValue<'frame, 'metadata>>::type_check(typ)
    }

    fn deserialize(
        typ: &'metadata ColumnType<'metadata>,
        v: Option<FrameSlice<'frame>>,
    ) -> Result<Self, DeserializationError> {
        let si8 = <Text as DeserializeValue<'frame, 'metadata>>::deserialize(typ, v)?;
        serde_json::from_str::<UserExtraDataCustomField>(&si8)
            .map_err(|_e| DeserializationError::new(UserExtraDataDeserializeErr(si8)))
    }
}

impl SerializeValue for UserExtraDataCustomField {
    fn serialize<'b>(
        &self,
        typ: &ColumnType,
        writer: CellWriter<'b>,
    ) -> Result<WrittenCellProof<'b>, SerializationError> {
        let disc = serde_json::to_string(&self).map_err(|_e| SerializationError::new(_e))?;

        let v = <Text as SerializeValue>::serialize(&disc, typ, writer)?;
        Ok(v)
    }
}