Skip to main content

open_library_api_rs/models/
list.rs

1// v0.0.1
2use serde::{Deserialize, Serialize};
3
4use super::common::Key;
5
6/// A user-created list.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct List {
9    pub key: String,
10    #[serde(default)]
11    pub name: Option<String>,
12    #[serde(default)]
13    pub description: Option<String>,
14    #[serde(default)]
15    pub tags: Option<Vec<String>>,
16    #[serde(default)]
17    pub seed_count: Option<u32>,
18    #[serde(default)]
19    pub edition_count: Option<u32>,
20    #[serde(default)]
21    pub last_update: Option<String>,
22    #[serde(default)]
23    pub seeds: Option<Vec<ListSeed>>,
24}
25
26/// A minimal list summary inside a lists-index response.
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct ListSummary {
29    pub key: String,
30    #[serde(default)]
31    pub name: Option<String>,
32    #[serde(default)]
33    pub seed_count: Option<u32>,
34    #[serde(default)]
35    pub edition_count: Option<u32>,
36}
37
38/// A seed (item) inside a list — can be a work, edition, author, or subject reference.
39#[derive(Debug, Clone, Serialize, Deserialize)]
40#[serde(untagged)]
41pub enum ListSeed {
42    Key(Key),
43    Subject { url: String, title: String },
44}
45
46/// Response from `GET /people/{username}/lists.json`.
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct UserLists {
49    #[serde(default)]
50    pub lists: Vec<ListSummary>,
51    #[serde(default)]
52    pub size: Option<u64>,
53}
54
55/// Response from `GET /people/{username}/lists/{list_id}/editions.json`.
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct ListEditions {
58    #[serde(default)]
59    pub entries: Vec<ListEditionEntry>,
60    #[serde(default)]
61    pub size: Option<u64>,
62    #[serde(default)]
63    pub links: Option<super::common::PaginationLinks>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct ListEditionEntry {
68    pub key: String,
69    #[serde(default)]
70    pub title: Option<String>,
71    #[serde(default)]
72    pub covers: Option<Vec<i64>>,
73    #[serde(default)]
74    pub publish_date: Option<String>,
75}
76
77/// Response from `GET /people/{username}/lists/{list_id}/subjects.json`.
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct ListSubjects {
80    #[serde(default)]
81    pub subjects: Vec<ListSubjectEntry>,
82    #[serde(default)]
83    pub places: Vec<ListSubjectEntry>,
84    #[serde(default)]
85    pub people: Vec<ListSubjectEntry>,
86    #[serde(default)]
87    pub times: Vec<ListSubjectEntry>,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct ListSubjectEntry {
92    pub name: String,
93    #[serde(default)]
94    pub count: Option<u32>,
95    #[serde(default)]
96    pub url: Option<String>,
97}
98
99/// Response from `GET /people/{username}/lists/{list_id}/seeds.json`.
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct ListSeeds {
102    #[serde(default)]
103    pub entries: Vec<ListSeed>,
104    #[serde(default)]
105    pub size: Option<u64>,
106}