2022-04-19 04:25:11 +00:00
|
|
|
use std::{borrow::Cow, marker::PhantomData};
|
2020-10-15 06:38:10 +00:00
|
|
|
|
2020-03-19 09:20:12 +00:00
|
|
|
use crate::{
|
2022-04-19 04:25:11 +00:00
|
|
|
connection::{edge::Edge, ConnectionNameType, EdgeNameType, PageInfo},
|
|
|
|
types::connection::{CursorType, EmptyFields},
|
|
|
|
Object, ObjectType, OutputType, TypeName,
|
2020-03-19 09:20:12 +00:00
|
|
|
};
|
|
|
|
|
2020-03-20 03:56:08 +00:00
|
|
|
/// Connection type
|
2020-03-19 09:20:12 +00:00
|
|
|
///
|
2020-06-15 06:17:19 +00:00
|
|
|
/// Connection is the result of a query for `connection::query`.
|
2022-04-19 04:25:11 +00:00
|
|
|
pub struct Connection<
|
|
|
|
Name,
|
|
|
|
EdgeName,
|
|
|
|
Cursor,
|
|
|
|
Node,
|
|
|
|
ConnectionFields = EmptyFields,
|
|
|
|
EdgeFields = EmptyFields,
|
|
|
|
> where
|
|
|
|
Name: ConnectionNameType,
|
|
|
|
EdgeName: EdgeNameType,
|
|
|
|
Cursor: CursorType + Send + Sync,
|
|
|
|
Node: OutputType,
|
|
|
|
ConnectionFields: ObjectType,
|
|
|
|
EdgeFields: ObjectType,
|
|
|
|
{
|
|
|
|
_mark1: PhantomData<Name>,
|
|
|
|
_mark2: PhantomData<EdgeName>,
|
2020-05-28 00:02:00 +00:00
|
|
|
/// All edges of the current page.
|
2022-04-19 04:25:11 +00:00
|
|
|
pub edges: Vec<Edge<EdgeName, Cursor, Node, EdgeFields>>,
|
|
|
|
/// Additional fields for connection object.
|
|
|
|
pub additional_fields: ConnectionFields,
|
|
|
|
/// If `true` means has previous page.
|
|
|
|
pub has_previous_page: bool,
|
|
|
|
/// If `false` means has next page.
|
|
|
|
pub has_next_page: bool,
|
2020-05-28 00:02:00 +00:00
|
|
|
}
|
2020-05-05 22:52:04 +00:00
|
|
|
|
2022-04-19 04:25:11 +00:00
|
|
|
impl<Name, EdgeName, Cursor, Node, EdgeFields>
|
|
|
|
Connection<Name, EdgeName, Cursor, Node, EmptyFields, EdgeFields>
|
|
|
|
where
|
|
|
|
Name: ConnectionNameType,
|
|
|
|
EdgeName: EdgeNameType,
|
|
|
|
Cursor: CursorType + Send + Sync,
|
|
|
|
Node: OutputType,
|
|
|
|
EdgeFields: ObjectType,
|
|
|
|
{
|
2020-05-28 00:02:00 +00:00
|
|
|
/// Create a new connection.
|
2022-04-19 04:25:11 +00:00
|
|
|
#[inline]
|
2020-05-28 00:02:00 +00:00
|
|
|
pub fn new(has_previous_page: bool, has_next_page: bool) -> Self {
|
|
|
|
Connection {
|
2022-04-19 04:25:11 +00:00
|
|
|
_mark1: PhantomData,
|
|
|
|
_mark2: PhantomData,
|
2020-05-28 00:02:00 +00:00
|
|
|
additional_fields: EmptyFields,
|
|
|
|
has_previous_page,
|
|
|
|
has_next_page,
|
|
|
|
edges: Vec::new(),
|
|
|
|
}
|
|
|
|
}
|
2020-03-19 09:20:12 +00:00
|
|
|
}
|
|
|
|
|
2022-04-19 04:25:11 +00:00
|
|
|
impl<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields>
|
|
|
|
Connection<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields>
|
|
|
|
where
|
|
|
|
Name: ConnectionNameType,
|
|
|
|
EdgeName: EdgeNameType,
|
|
|
|
Cursor: CursorType + Send + Sync,
|
|
|
|
Node: OutputType,
|
|
|
|
ConnectionFields: ObjectType,
|
|
|
|
EdgeFields: ObjectType,
|
|
|
|
{
|
2020-05-28 00:02:00 +00:00
|
|
|
/// Create a new connection, it can have some additional fields.
|
2022-04-19 04:25:11 +00:00
|
|
|
#[inline]
|
2020-05-29 02:28:18 +00:00
|
|
|
pub fn with_additional_fields(
|
2020-03-19 09:20:12 +00:00
|
|
|
has_previous_page: bool,
|
|
|
|
has_next_page: bool,
|
2022-04-19 04:25:11 +00:00
|
|
|
additional_fields: ConnectionFields,
|
2020-03-19 09:20:12 +00:00
|
|
|
) -> Self {
|
|
|
|
Connection {
|
2022-04-19 04:25:11 +00:00
|
|
|
_mark1: PhantomData,
|
|
|
|
_mark2: PhantomData,
|
2020-05-28 00:02:00 +00:00
|
|
|
additional_fields,
|
|
|
|
has_previous_page,
|
|
|
|
has_next_page,
|
|
|
|
edges: Vec::new(),
|
2020-03-19 09:20:12 +00:00
|
|
|
}
|
|
|
|
}
|
2020-05-28 00:02:00 +00:00
|
|
|
}
|
2020-03-19 09:20:12 +00:00
|
|
|
|
2022-04-19 04:25:11 +00:00
|
|
|
#[Object(internal, name_type)]
|
|
|
|
impl<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields>
|
|
|
|
Connection<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields>
|
|
|
|
where
|
|
|
|
Name: ConnectionNameType,
|
|
|
|
EdgeName: EdgeNameType,
|
|
|
|
Cursor: CursorType + Send + Sync,
|
|
|
|
Node: OutputType,
|
|
|
|
ConnectionFields: ObjectType,
|
|
|
|
EdgeFields: ObjectType,
|
|
|
|
{
|
|
|
|
/// Information to aid in pagination.
|
|
|
|
async fn page_info(&self) -> PageInfo {
|
|
|
|
PageInfo {
|
2020-05-29 04:19:08 +00:00
|
|
|
has_previous_page: self.has_previous_page,
|
|
|
|
has_next_page: self.has_next_page,
|
2022-04-19 04:25:11 +00:00
|
|
|
start_cursor: self.edges.first().map(|edge| edge.cursor.0.encode_cursor()),
|
|
|
|
end_cursor: self.edges.last().map(|edge| edge.cursor.0.encode_cursor()),
|
2020-05-29 04:19:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-19 04:25:11 +00:00
|
|
|
/// A list of edges.
|
|
|
|
#[inline]
|
|
|
|
async fn edges(&self) -> &[Edge<EdgeName, Cursor, Node, EdgeFields>] {
|
|
|
|
&self.edges
|
2020-04-26 04:34:08 +00:00
|
|
|
}
|
2020-03-19 09:20:12 +00:00
|
|
|
|
2022-04-19 04:25:11 +00:00
|
|
|
#[graphql(flatten)]
|
|
|
|
#[inline]
|
|
|
|
async fn additional_fields(&self) -> &ConnectionFields {
|
|
|
|
&self.additional_fields
|
2021-11-09 10:52:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-19 04:25:11 +00:00
|
|
|
impl<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields> TypeName
|
|
|
|
for Connection<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields>
|
2021-11-09 10:52:10 +00:00
|
|
|
where
|
2022-04-19 04:25:11 +00:00
|
|
|
Name: ConnectionNameType,
|
|
|
|
EdgeName: EdgeNameType,
|
|
|
|
Cursor: CursorType + Send + Sync,
|
|
|
|
Node: OutputType,
|
|
|
|
ConnectionFields: ObjectType,
|
|
|
|
EdgeFields: ObjectType,
|
2020-05-28 00:02:00 +00:00
|
|
|
{
|
2022-04-19 04:25:11 +00:00
|
|
|
#[inline]
|
2020-03-19 09:20:12 +00:00
|
|
|
fn type_name() -> Cow<'static, str> {
|
2022-04-19 04:25:11 +00:00
|
|
|
Name::type_name::<Node>().into()
|
2020-03-19 09:20:12 +00:00
|
|
|
}
|
|
|
|
}
|