1#![forbid(unsafe_code)]
2
3use serde::{Deserialize, Serialize};
4use std::fmt::Debug;
5
6use crate::cursor::{Cursor, CursorType};
7
8#[cfg(feature = "pg")]
9mod pg;
10#[cfg(feature = "pg")]
11pub use pg::*;
12
13#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
14pub struct Edge<N> {
15 pub cursor: CursorType,
16 pub node: N,
17}
18
19impl<N: Cursor> From<N> for Edge<N> {
20 fn from(value: N) -> Self {
21 Self {
22 cursor: value.to_cursor(),
23 node: value,
24 }
25 }
26}
27
28#[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
29pub struct PageInfo {
30 pub has_previous_page: bool,
31 pub has_next_page: bool,
32 pub start_cursor: Option<CursorType>,
33 pub end_cursor: Option<CursorType>,
34}
35
36#[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
37pub struct QueryResult<N> {
38 pub edges: Vec<Edge<N>>,
39 pub page_info: PageInfo,
40}
41
42#[derive(Default, Serialize, Deserialize)]
43pub struct QueryArgs {
44 pub first: Option<u16>,
45 pub after: Option<CursorType>,
46 pub last: Option<u16>,
47 pub before: Option<CursorType>,
48}
49
50impl QueryArgs {
51 pub fn backward(last: u16, before: Option<CursorType>) -> Self {
52 Self {
53 last: Some(last),
54 before,
55 ..Default::default()
56 }
57 }
58
59 pub fn forward(first: u16, after: Option<CursorType>) -> Self {
60 Self {
61 first: Some(first),
62 after,
63 ..Default::default()
64 }
65 }
66
67 pub fn is_backward(&self) -> bool {
68 (self.last.is_some() || self.before.is_some())
69 && self.first.is_none()
70 && self.after.is_none()
71 }
72
73 pub fn is_none(&self) -> bool {
74 self.last.is_none() && self.before.is_none() && self.first.is_none() && self.after.is_none()
75 }
76}