farmap 0.10.1

A library for working with Farcaster label datasets
Documentation
use crate::cast_type::CastType;
use crate::dated::Dated;
use crate::spam_score::{DatedSpamUpdate, SpamScore, SpamUpdate};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use std::fmt::Debug;

pub trait UserValue:
    Serialize + DeserializeOwned + Clone + Debug + PartialEq + UserValueSeal
{
    fn into_any_user_value(self) -> AnyUserValue;

    fn as_any_user_value(&self) -> AnyUserValue;

    fn from_any_user_value(any_user_value: AnyUserValue) -> Option<Self>;

    fn from_any_user_value_ref(any_user_value: &AnyUserValue) -> Option<&Self>;
}

pub trait UserValueSeal {}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)]
#[non_exhaustive]
pub enum AnyUserValue {
    DatedSpamUpdate(DatedSpamUpdate),
    SpamUpdate(SpamUpdate),
    SpamScore(SpamScore),
    DatedCastType(Dated<CastType>),
}

impl AnyUserValue {
    pub fn specify<T: UserValue>(self) -> Option<T> {
        T::from_any_user_value(self)
    }

    pub fn specify_ref<T: UserValue>(&self) -> Option<&T> {
        T::from_any_user_value_ref(self)
    }
}