diff --git a/src/types/connection/mod.rs b/src/types/connection/mod.rs index 5ed81183..cfd3fe8e 100644 --- a/src/types/connection/mod.rs +++ b/src/types/connection/mod.rs @@ -171,6 +171,76 @@ pub trait DataSource { } /// If you don't want to implement DataSource, you can also use this function to query data directly. +/// +/// # Examples +/// +/// ```rust +/// use async_graphql::*; +/// use async_graphql::connection::*; +/// +/// struct QueryRoot; +/// +/// struct Numbers; +/// +/// #[SimpleObject] +/// struct Diff { +/// diff: i32, +/// } +/// +/// #[Object] +/// impl QueryRoot { +/// async fn numbers(&self, +/// after: Option, +/// before: Option, +/// first: Option, +/// last: Option +/// ) -> FieldResult> { +/// query(after, before, first, last, |after, before, first, last| async move { +/// let mut start = after.map(|after| after + 1).unwrap_or(0); +/// let mut end = before.unwrap_or(10000); +/// if let Some(first) = first { +/// end = (start + first).min(end); +/// } +/// if let Some(last) = last { +/// start = if last > end - start { +/// end +/// } else { +/// end - last +/// }; +/// } +/// let mut connection = Connection::new(start > 0, end < 10000); +/// connection.append( +/// (start..end).into_iter().map(|n| +/// Edge::with_additional_fields(n, n as i32, Diff{ diff: (10000 - n) as i32 })), +/// ); +/// Ok(connection) +/// }).await +/// } +/// } +/// +/// #[async_std::main] +/// async fn main() { +/// let schema = Schema::new(QueryRoot, EmptyMutation, EmptySubscription); +/// +/// assert_eq!(schema.execute("{ numbers(first: 2) { edges { node diff } } }").await.unwrap().data, serde_json::json!({ +/// "numbers": { +/// "edges": [ +/// {"node": 0, "diff": 10000}, +/// {"node": 1, "diff": 9999}, +/// ] +/// }, +/// })); +/// +/// assert_eq!(schema.execute("{ numbers(last: 2) { edges { node diff } } }").await.unwrap().data, serde_json::json!({ +/// "numbers": { +/// "edges": [ +/// {"node": 9998, "diff": 2}, +/// {"node": 9999, "diff": 1}, +/// ] +/// }, +/// })); +/// } +/// ``` pub async fn query( after: Option, before: Option,