use std::cell::RefCell;
use std::collections::HashMap;
use std::error::Error;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use futures::Stream;
use reqwest::Response;
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use crate::core::{APIClient, FinalRequestOptions, RequestOptions, PageInfo};
use crate::resource::APIResource;
pub trait Page<Req: Default + Clone + Serialize, Item: for<'de> Deserialize<'de>>: Sized {
fn new(client: APIResource, body: CursorPageResponse<Item>, options: FinalRequestOptions<Req>) -> Self;
fn next_page_info(&self) -> Option<PageInfo>;
fn get_paginated_items(&self) -> Vec<Item>;
fn has_next_page(&self) -> bool;
async fn get_next_page(&self) -> Result<Self, Box<dyn Error>>;
async fn iter_pages(&self) -> &Self;
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CursorPageResponse<Item> {
object: CursorPageResponseObject,
data: Vec<Item>,
first_id: String,
last_id: String,
has_more: bool
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum CursorPageResponseObject {
#[default]
List,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CursorPageParams {
pub after: String,
pub limit: u32,
}
#[derive(Debug)]
pub struct CursorPage<Req: Default + Clone + Serialize, Item: for<'de> Deserialize<'de>> { pub data: Vec<Item>,
pub client: APIResource,
pub options: FinalRequestOptions<Req>,
pub body: CursorPageResponse<Item>,
}
impl<Req: Default + Clone + Serialize, Item: for<'de> Deserialize<'de> + Clone + 'static> Page<Req, Item> for CursorPage<Req, Item> {
fn new(
client: APIResource,
body: CursorPageResponse<Item>,
options: FinalRequestOptions<Req>,
) -> Self {
CursorPage {
client: client,
data: body.data.clone(),
body: body,
options: options,
}
}
fn next_page_info(&self) -> Option<PageInfo> {
let data = self.get_paginated_items();
if data.len() == 0 {
return None;
}
None
}
fn get_paginated_items(&self) -> Vec<Item> {
vec![]
}
fn has_next_page(&self) -> bool {
let items = self.get_paginated_items();
if items.len() == 0 {
return false;
}
return self.next_page_info().is_some();
}
async fn get_next_page(&self) -> Result<Self, Box<dyn Error>> {
let next_info = self.next_page_info();
if next_info.is_none() {
}
let mut next_info = next_info.unwrap();
let mut next_options = self.options.clone();
match next_info {
PageInfo::Params(params) => {
return Err("Not implemented".into());
}
PageInfo::Url(url) => {
next_options.query = None;
next_options.path = url.to_string();
}
}
let page_constructor = |
client: APIResource,
body: CursorPageResponse<Item>,
options: FinalRequestOptions<Req>,
| {
CursorPage::new(client, body, options)
};
let result = self.client.clone().lock().unwrap().request_api_list(page_constructor, next_options).await.unwrap();
Ok(result)
}
async fn iter_pages(&self) -> &Self {
self
}
}