use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize, Clone, Copy)]
pub enum Attributes {
Common(CommonAttributes),
Item(ItemAttributes),
Resource(ResourceAttributes),
}
#[derive(Debug, Default, Serialize, Deserialize, Clone, Copy)]
pub struct CommonAttributes {
pub facets: Option<bool>,
pub pagination: Option<bool>,
pub results: Option<bool>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone, Copy)]
pub struct ItemAttributes {
pub cite_this: Option<bool>,
pub item: Option<bool>,
pub resources: Option<bool>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone, Copy)]
pub struct ResourceAttributes {
pub cite_this: Option<bool>,
pub item: Option<bool>,
pub page: Option<bool>,
pub resource: Option<bool>,
pub resources: Option<bool>,
pub segments: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy)]
pub enum SortField {
#[serde(rename = "date")]
Date, #[serde(rename = "date_desc")]
DateDesc, #[serde(rename = "title_s")]
TitleS, #[serde(rename = "title_s_desc")]
TitleSDesc, #[serde(rename = "shelf_id")]
ShelfId, #[serde(rename = "shelf_id_desc")]
ShelfIdDesc, }
impl SortField {
pub fn slug(&self) -> &'static str {
match self {
SortField::Date => "date",
SortField::DateDesc => "date_desc",
SortField::TitleS => "title_s",
SortField::TitleSDesc => "title_s_desc",
SortField::ShelfId => "shelf_id",
SortField::ShelfIdDesc => "shelf_id_desc",
}
}
}
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct AttributesSelect {
pub include: Vec<String>,
pub exclude: Vec<String>,
}
impl AttributesSelect {
pub fn to_query_param(&self) -> String {
let mut parts = Vec::new();
if !self.include.is_empty() {
parts.push(format!("at={}", self.include.join(",")));
}
if !self.exclude.is_empty() {
parts.push(format!("at!={}", self.exclude.join(",")));
}
parts.join("&")
}
}