use serde::{Deserialize, Serialize};
pub type AnnotationMetadata =
MetadataWithActions<AnnotationActions, Metadata<AnnotationInteractions>>;
pub type UserMetadata = MetadataWithFeatures<Metadata<UserInteractions>>;
pub type UserInteractionMetadata = Metadata<UserInteractions>;
pub type SongMetadata = MetadataWithActions<
SongActions,
MetadataWithRelationships<SongRelationships, Metadata<SongInteractions>>,
>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Metadata<I> {
pub permissions: Vec<String>,
pub excluded_permissions: Vec<String>,
pub interactions: I,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MetadataWithActions<A, M> {
pub iq_by_action: A,
#[serde(flatten)]
pub metadata: M,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MetadataWithFeatures<M> {
pub features: Vec<String>,
#[serde(flatten)]
pub metadata: M,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct MetadataWithRelationships<R, M> {
pub relationships: R,
#[serde(flatten)]
pub metadata: M,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct AnnotationInteractions {
pub cosign: bool,
pub pyong: bool,
pub vote: Option<Vote>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct UserInteractions {
pub following: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct SongInteractions {
pub following: bool,
pub pyong: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct AnnotationActions {
#[serde(skip_serializing_if = "Option::is_none")]
pub accept: Option<PrimaryAction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reject: Option<PrimaryAction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delete: Option<PrimaryAction>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct SongActions {
#[serde(skip_serializing_if = "Option::is_none")]
pub edit_metadata: Option<PrimaryAction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub answer_question: Option<PrimaryAction>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct SongRelationships {
#[serde(skip_serializing_if = "Option::is_none")]
pub pinned_role: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct PrimaryAction {
pub primary: Action,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct Action {
pub applicable: bool,
pub base: f32,
pub multiplier: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Vote {
Up,
Down,
}