open-library-api-rs 0.1.0

Async Rust client for the Open Library API
Documentation
// v0.0.1
use serde::{Deserialize, Serialize};

use super::common::Key;

/// A user-created list.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct List {
    pub key: String,
    #[serde(default)]
    pub name: Option<String>,
    #[serde(default)]
    pub description: Option<String>,
    #[serde(default)]
    pub tags: Option<Vec<String>>,
    #[serde(default)]
    pub seed_count: Option<u32>,
    #[serde(default)]
    pub edition_count: Option<u32>,
    #[serde(default)]
    pub last_update: Option<String>,
    #[serde(default)]
    pub seeds: Option<Vec<ListSeed>>,
}

/// A minimal list summary inside a lists-index response.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSummary {
    pub key: String,
    #[serde(default)]
    pub name: Option<String>,
    #[serde(default)]
    pub seed_count: Option<u32>,
    #[serde(default)]
    pub edition_count: Option<u32>,
}

/// A seed (item) inside a list — can be a work, edition, author, or subject reference.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ListSeed {
    Key(Key),
    Subject { url: String, title: String },
}

/// Response from `GET /people/{username}/lists.json`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserLists {
    #[serde(default)]
    pub lists: Vec<ListSummary>,
    #[serde(default)]
    pub size: Option<u64>,
}

/// Response from `GET /people/{username}/lists/{list_id}/editions.json`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListEditions {
    #[serde(default)]
    pub entries: Vec<ListEditionEntry>,
    #[serde(default)]
    pub size: Option<u64>,
    #[serde(default)]
    pub links: Option<super::common::PaginationLinks>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListEditionEntry {
    pub key: String,
    #[serde(default)]
    pub title: Option<String>,
    #[serde(default)]
    pub covers: Option<Vec<i64>>,
    #[serde(default)]
    pub publish_date: Option<String>,
}

/// Response from `GET /people/{username}/lists/{list_id}/subjects.json`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSubjects {
    #[serde(default)]
    pub subjects: Vec<ListSubjectEntry>,
    #[serde(default)]
    pub places: Vec<ListSubjectEntry>,
    #[serde(default)]
    pub people: Vec<ListSubjectEntry>,
    #[serde(default)]
    pub times: Vec<ListSubjectEntry>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSubjectEntry {
    pub name: String,
    #[serde(default)]
    pub count: Option<u32>,
    #[serde(default)]
    pub url: Option<String>,
}

/// Response from `GET /people/{username}/lists/{list_id}/seeds.json`.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSeeds {
    #[serde(default)]
    pub entries: Vec<ListSeed>,
    #[serde(default)]
    pub size: Option<u64>,
}