evento_query/
query.rs

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}