use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Key {
pub key: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TypedKey {
pub key: String,
#[serde(rename = "type")]
pub kind: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Link {
pub url: String,
#[serde(default)]
pub title: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TextOrValue {
Text(String),
Value { value: String },
}
impl TextOrValue {
pub fn into_text(self) -> String {
match self {
TextOrValue::Text(s) => s,
TextOrValue::Value { value } => value,
}
}
pub fn as_str(&self) -> &str {
match self {
TextOrValue::Text(s) => s.as_str(),
TextOrValue::Value { value } => value.as_str(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum IntOrValue {
Int(i64),
Value { value: i64 },
}
impl IntOrValue {
pub fn value(&self) -> i64 {
match self {
IntOrValue::Int(n) => *n,
IntOrValue::Value { value } => *value,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginationLinks {
#[serde(rename = "self")]
pub self_url: Option<String>,
pub next: Option<String>,
pub prev: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ImageSize {
#[serde(rename = "S")]
Small,
#[serde(rename = "M")]
Medium,
#[serde(rename = "L")]
Large,
}
impl ImageSize {
pub fn as_str(self) -> &'static str {
match self {
ImageSize::Small => "S",
ImageSize::Medium => "M",
ImageSize::Large => "L",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CoverKey {
Id,
Isbn,
Oclc,
Lccn,
Olid,
}
impl CoverKey {
pub fn as_str(self) -> &'static str {
match self {
CoverKey::Id => "id",
CoverKey::Isbn => "isbn",
CoverKey::Oclc => "oclc",
CoverKey::Lccn => "lccn",
CoverKey::Olid => "olid",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VolumeIdType {
Isbn,
Lccn,
Oclc,
Olid,
}
impl VolumeIdType {
pub fn as_str(self) -> &'static str {
match self {
VolumeIdType::Isbn => "isbn",
VolumeIdType::Lccn => "lccn",
VolumeIdType::Oclc => "oclc",
VolumeIdType::Olid => "olid",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ChangeKind {
AddCover,
AddBook,
EditBook,
MergeAuthors,
Update,
Revert,
NewAccount,
Register,
Lists,
#[serde(other)]
Other,
}
impl ChangeKind {
pub fn as_str(&self) -> &str {
match self {
ChangeKind::AddCover => "add-cover",
ChangeKind::AddBook => "add-book",
ChangeKind::EditBook => "edit-book",
ChangeKind::MergeAuthors => "merge-authors",
ChangeKind::Update => "update",
ChangeKind::Revert => "revert",
ChangeKind::NewAccount => "new-account",
ChangeKind::Register => "register",
ChangeKind::Lists => "lists",
ChangeKind::Other => "other",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReadingShelf {
WantToRead,
CurrentlyReading,
AlreadyRead,
}
impl ReadingShelf {
pub fn as_str(self) -> &'static str {
match self {
ReadingShelf::WantToRead => "want-to-read",
ReadingShelf::CurrentlyReading => "currently-reading",
ReadingShelf::AlreadyRead => "already-read",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SortOrder {
Relevance,
NewestFirst,
OldestFirst,
}
impl SortOrder {
pub fn as_str(self) -> &'static str {
match self {
SortOrder::Relevance => "relevance",
SortOrder::NewestFirst => "new",
SortOrder::OldestFirst => "old",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BooksJsCmd {
Data,
Details,
ViewApi,
}
impl BooksJsCmd {
pub fn as_str(self) -> &'static str {
match self {
BooksJsCmd::Data => "data",
BooksJsCmd::Details => "details",
BooksJsCmd::ViewApi => "viewapi",
}
}
}