use serde::{Serialize, Serializer};
use serde_with::skip_serializing_none;
use crate::client::Client;
use crate::error::RsError;
use super::{List, SortOrder};
#[derive(Debug)]
pub struct SearchApi<'a> {
client: &'a Client,
}
impl<'a> SearchApi<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn do_search(&self, request: DoSearchRequest) -> Result<serde_json::Value, RsError> {
self.client
.send_request("do_search", reqwest::Method::GET, request)
.await
}
pub async fn search_get_previews(
&self,
request: SearchGetPreviewsRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("search_get_previews", reqwest::Method::GET, request)
.await
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum FetchRows {
Limit(u32),
Page { offset: u32, limit: u32 },
}
impl FetchRows {
pub fn limit(n: u32) -> Self {
Self::Limit(n)
}
pub fn page(offset: u32, limit: u32) -> Self {
Self::Page { offset, limit }
}
}
impl Serialize for FetchRows {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Limit(n) => n.serialize(serializer),
Self::Page { offset, limit } => format!("{},{}", offset, limit).serialize(serializer),
}
}
}
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct DoSearchRequest {
pub search: String,
pub restypes: Option<List<u32>>,
pub order_by: Option<String>,
pub archive: Option<i8>,
pub fetchrows: Option<FetchRows>,
pub sort: Option<SortOrder>,
pub offset: Option<u32>,
}
impl DoSearchRequest {
pub fn new(search: impl Into<String>) -> Self {
Self {
search: search.into(),
restypes: None,
order_by: None,
archive: None,
fetchrows: None,
sort: None,
offset: None,
}
}
pub fn restypes(mut self, restypes: impl Into<List<u32>>) -> Self {
self.restypes = Some(restypes.into());
self
}
pub fn order_by(mut self, order_by: impl Into<String>) -> Self {
self.order_by = Some(order_by.into());
self
}
pub fn archive(mut self, archive: i8) -> Self {
self.archive = Some(archive);
self
}
pub fn fetchrows(mut self, fetchrows: FetchRows) -> Self {
self.fetchrows = Some(fetchrows);
self
}
pub fn sort(mut self, sort: SortOrder) -> Self {
self.sort = Some(sort);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.offset = Some(offset);
self
}
}
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct SearchGetPreviewsRequest {
pub search: String,
pub restypes: Option<List<u32>>,
pub order_by: Option<String>,
pub archive: Option<i8>,
pub fetchrows: Option<FetchRows>,
pub sort: Option<SortOrder>,
pub recent_search_daylimit: Option<String>,
pub getsizes: Option<List<u32>>,
pub previewext: Option<String>,
}
impl SearchGetPreviewsRequest {
pub fn new(search: impl Into<String>) -> Self {
Self {
search: search.into(),
restypes: None,
order_by: None,
archive: None,
fetchrows: None,
sort: None,
recent_search_daylimit: None,
getsizes: None,
previewext: None,
}
}
pub fn restypes(mut self, restypes: impl Into<List<u32>>) -> Self {
self.restypes = Some(restypes.into());
self
}
pub fn order_by(mut self, order_by: impl Into<String>) -> Self {
self.order_by = Some(order_by.into());
self
}
pub fn archive(mut self, archive: i8) -> Self {
self.archive = Some(archive);
self
}
pub fn fetchrows(mut self, fetchrows: FetchRows) -> Self {
self.fetchrows = Some(fetchrows);
self
}
pub fn sort(mut self, sort: SortOrder) -> Self {
self.sort = Some(sort);
self
}
pub fn recent_search_daylimit(mut self, recent_search_daylimit: impl Into<String>) -> Self {
self.recent_search_daylimit = Some(recent_search_daylimit.into());
self
}
pub fn getsizes(mut self, getsizes: impl Into<List<u32>>) -> Self {
self.getsizes = Some(getsizes.into());
self
}
pub fn previewext(mut self, previewext: impl Into<String>) -> Self {
self.previewext = Some(previewext.into());
self
}
}