juniper_relay/
lib.rs

1#[macro_use]
2extern crate juniper;
3
4#[derive(GraphQLObject)]
5pub struct PageInfo {
6    pub has_previous_page: bool,
7    pub has_next_page: bool
8}
9
10#[macro_export]
11macro_rules! relay_connection {
12    ($name:ident, $edgename:ident, $type:ty) => {
13        relay_connection!($name, $edgename, $type, ());
14    };
15    ($name:ident, $edgename:ident, $type:ty, $context:ty) => {
16        pub struct $edgename {
17            node: $type,
18            cursor: String
19        }
20
21        graphql_object!($edgename: $context |&self| {
22            field node() -> &$type {
23                &self.node
24            }
25
26            field cursor() -> &String {
27                &self.cursor
28            }
29        });
30
31        impl $edgename {
32            #[allow(dead_code)]
33            pub fn new(node: $type, cursor: String) -> $edgename {
34                $edgename {
35                    node: node,
36                    cursor: cursor
37                }
38            }
39        }
40
41        pub struct $name {
42            page_info: $crate::PageInfo,
43            edges: Vec<$edgename>
44        }
45
46        graphql_object!($name: $context |&self| {
47            field page_info() -> &$crate::PageInfo {
48                &self.page_info
49            }
50
51            field edges() -> &Vec<$edgename> {
52                &self.edges
53            }
54        });
55
56        impl $name {
57            #[allow(dead_code)]
58            pub fn new(page_info: $crate::PageInfo, edges: Vec<$edgename>) -> $name {
59                $name {
60                    page_info: page_info,
61                    edges: edges
62                }
63            }
64        }
65    }
66}