use crate::{ fetcher::post_or_comment::PostOrComment, objects::person::ApubPerson, protocol::Unparsed, }; use lemmy_apub_lib::object_id::ObjectId; use lemmy_utils::LemmyError; use serde::{Deserialize, Serialize}; use std::convert::TryFrom; use strum_macros::Display; use url::Url; #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct Vote { pub(crate) actor: ObjectId, #[serde(deserialize_with = "crate::deserialize_one_or_many")] pub(crate) to: Vec, pub(crate) object: ObjectId, #[serde(deserialize_with = "crate::deserialize_one_or_many")] pub(crate) cc: Vec, #[serde(rename = "type")] pub(crate) kind: VoteType, pub(crate) id: Url, #[serde(flatten)] pub(crate) unparsed: Unparsed, } #[derive(Clone, Debug, Display, Deserialize, Serialize)] pub enum VoteType { Like, Dislike, } impl TryFrom for VoteType { type Error = LemmyError; fn try_from(value: i16) -> Result { match value { 1 => Ok(VoteType::Like), -1 => Ok(VoteType::Dislike), _ => Err(LemmyError::from_message("invalid vote value")), } } } impl From<&VoteType> for i16 { fn from(value: &VoteType) -> i16 { match value { VoteType::Like => 1, VoteType::Dislike => -1, } } }