1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#[macro_use]
extern crate juniper;

#[derive(GraphQLObject)]
pub struct PageInfo {
    pub has_previous_page: bool,
    pub has_next_page: bool
}

#[macro_export]
macro_rules! relay_connection {
    ($name:ident, $edgename:ident, $type:ty) => {
        relay_connection!($name, $edgename, $type, ());
    };
    ($name:ident, $edgename:ident, $type:ty, $context:ty) => {
        pub struct $edgename {
            node: $type,
            cursor: String
        }

        graphql_object!($edgename: $context |&self| {
            field node() -> &$type {
                &self.node
            }

            field cursor() -> &String {
                &self.cursor
            }
        });

        impl $edgename {
            #[allow(dead_code)]
            pub fn new(node: $type, cursor: String) -> $edgename {
                $edgename {
                    node: node,
                    cursor: cursor
                }
            }
        }

        pub struct $name {
            page_info: $crate::PageInfo,
            edges: Vec<$edgename>
        }

        graphql_object!($name: $context |&self| {
            field page_info() -> &$crate::PageInfo {
                &self.page_info
            }

            field edges() -> &Vec<$edgename> {
                &self.edges
            }
        });

        impl $name {
            #[allow(dead_code)]
            pub fn new(page_info: $crate::PageInfo, edges: Vec<$edgename>) -> $name {
                $name {
                    page_info: page_info,
                    edges: edges
                }
            }
        }
    }
}