use serde::{
Deserialize,
Serialize,
};
use std::collections::HashMap;
use url::Url;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ImageList {
pub images: Vec<Image>,
#[serde(flatten)]
pub unknown: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Image {
pub id: String,
pub artist: Option<String>,
pub nsfw: bool,
pub tags: Vec<String>,
pub likes: u64,
pub favorites: u64,
pub uploader: ShortUser,
pub approver: Option<ShortUser>,
pub comments: Vec<serde_json::Value>,
#[serde(rename = "originalHash")]
pub original_hash: String,
#[serde(rename = "createdAt")]
pub created_at: String,
}
impl Image {
pub fn get_url(&self) -> Result<Url, url::ParseError> {
let base = Url::parse("https://nekos.moe/image/").unwrap();
base.join(&self.id)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ShortUser {
pub id: String,
pub username: String,
}
#[cfg(test)]
mod test {
use super::*;
const RANDOM: &str = include_str!("../test_data/random.json");
#[test]
fn parse_image_list() {
let image_list: ImageList = serde_json::from_str(RANDOM).expect("failed to parse");
dbg!(image_list);
}
}