Function async_graphql::types::connection::query_with
source · pub async fn query_with<Cursor, T, F, R, E>(
after: Option<String>,
before: Option<String>,
first: Option<i32>,
last: Option<i32>,
f: F
) -> Result<T>where
Cursor: CursorType + Send + Sync,
<Cursor as CursorType>::Error: Display + Send + Sync + 'static,
F: FnOnce(Option<Cursor>, Option<Cursor>, Option<usize>, Option<usize>) -> R,
R: Future<Output = Result<T, E>>,
E: Into<Error>,
Expand description
Parses the parameters and executes the query and return a custom
Connection
type.
Connection<T>
and Edge<T>
have certain limitations. For example, you
cannot customize the name of the type, so you can use this function to
execute the query and return a customized Connection
type.
Examples
use async_graphql::*;
use async_graphql::types::connection::*;
#[derive(SimpleObject)]
struct MyEdge {
cursor: usize,
node: i32,
diff: i32,
}
#[derive(SimpleObject)]
struct MyConnection {
edges: Vec<MyEdge>,
page_info: PageInfo,
}
struct Query;
#[Object]
impl Query {
async fn numbers(&self,
after: Option<String>,
before: Option<String>,
first: Option<i32>,
last: Option<i32>
) -> Result<MyConnection> {
query_with(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 connection = MyConnection {
edges: (start..end).into_iter().map(|n| MyEdge {
cursor: n,
node: n as i32,
diff: (10000 - n) as i32,
}).collect(),
page_info: PageInfo {
has_previous_page: start > 0,
has_next_page: end < 10000,
start_cursor: Some(start.encode_cursor()),
end_cursor: Some(end.encode_cursor()),
},
};
Ok::<_, Error>(connection)
}).await
}
}
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
assert_eq!(schema.execute("{ numbers(first: 2) { edges { node diff } } }").await.into_result().unwrap().data, value!({
"numbers": {
"edges": [
{"node": 0, "diff": 10000},
{"node": 1, "diff": 9999},
]
},
}));
assert_eq!(schema.execute("{ numbers(last: 2) { edges { node diff } } }").await.into_result().unwrap().data, value!({
"numbers": {
"edges": [
{"node": 9998, "diff": 2},
{"node": 9999, "diff": 1},
]
},
}));
Examples found in repository?
src/types/connection/mod.rs (line 212)
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
pub async fn query<Name, EdgeName, Cursor, Node, ConnectionFields, EdgeFields, F, R, E>(
after: Option<String>,
before: Option<String>,
first: Option<i32>,
last: Option<i32>,
f: F,
) -> Result<Connection<Cursor, Node, ConnectionFields, EdgeFields, Name, EdgeName>>
where
Name: ConnectionNameType,
EdgeName: EdgeNameType,
Cursor: CursorType + Send + Sync,
<Cursor as CursorType>::Error: Display + Send + Sync + 'static,
Node: OutputType,
ConnectionFields: ObjectType,
EdgeFields: ObjectType,
F: FnOnce(Option<Cursor>, Option<Cursor>, Option<usize>, Option<usize>) -> R,
R: Future<
Output = Result<Connection<Cursor, Node, ConnectionFields, EdgeFields, Name, EdgeName>, E>,
>,
E: Into<Error>,
{
query_with(after, before, first, last, f).await
}