#[cfg(feature = "catchall")]
use std::collections::HashMap;
use chrono::{serde::ts_seconds, DateTime, Utc};
use serde::{Deserialize, Serialize};
#[cfg(feature = "catchall")]
use serde_json::Value;
use super::annotation::Annotation;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ReferentsResponse {
pub referents: Vec<Referent>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Referent {
pub annotations: Vec<Annotation>,
#[serde(flatten)]
pub core: ReferentCore,
#[cfg(feature = "catchall")]
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct ReferentCore {
#[serde(rename = "_type")]
pub referent_type: ReferentType,
#[serde(skip_serializing_if = "Option::is_none")]
pub featured: Option<bool>,
pub annotator_id: u32,
pub annotator_login: String,
pub api_path: String,
pub classification: String,
pub fragment: String,
pub id: u32,
pub is_description: bool,
pub path: String,
pub range: Range,
pub song_id: Option<u32>,
pub url: String,
pub verified_annotator_ids: Vec<u32>,
pub annotatable: Annotatable,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Range {
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_offset: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_offset: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
pub content: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Annotatable {
pub api_path: String,
pub context: Option<String>,
pub id: u32,
pub image_url: String,
pub link_title: String,
pub title: String,
#[serde(rename = "type")]
pub annotatable_type: String,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_timestamps: Option<Timestamps>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
pub struct Timestamps {
#[serde(with = "ts_seconds")]
pub updated_by_human_at: DateTime<Utc>,
#[serde(with = "ts_seconds")]
pub lyrics_updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum ReferentType {
#[default]
Referent,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_referent_type_default() {
assert_eq!(ReferentType::default(), ReferentType::Referent);
}
}