1
+ use super :: types:: * ;
1
2
use crate :: blocking:: StudioClient ;
2
3
use crate :: RoverClientError ;
3
4
use graphql_client:: * ;
@@ -6,66 +7,69 @@ use graphql_client::*;
6
7
// The paths are relative to the directory where your `Cargo.toml` is located.
7
8
// Both json and the GraphQL schema language are supported as sources for the schema
8
9
#[ graphql(
9
- query_path = "src/query/subgraph/fetch.graphql" ,
10
+ query_path = "src/query/subgraph/fetch/fetch_query .graphql" ,
10
11
schema_path = ".schema/schema.graphql" ,
11
12
response_derives = "PartialEq, Debug, Serialize, Deserialize" ,
12
13
deprecated = "warn"
13
14
) ]
14
15
/// This struct is used to generate the module containing `Variables` and
15
16
/// `ResponseData` structs.
16
- /// Snake case of this name is the mod name. i.e. fetch_subgraph_query
17
- pub struct FetchSubgraphQuery ;
17
+ /// Snake case of this name is the mod name. i.e. subgraph_fetch_query
18
+ pub ( crate ) struct SubgraphFetchQuery ;
18
19
19
20
/// Fetches a schema from apollo studio and returns its SDL (String)
20
21
pub fn run (
21
- variables : fetch_subgraph_query :: Variables ,
22
+ input : SubgraphFetchInput ,
22
23
client : & StudioClient ,
23
- // we can't specify this as a variable in the op, so we have to filter the
24
- // operation response by this name
25
- subgraph : & str ,
26
- ) -> Result < String , RoverClientError > {
27
- let graph = variables. graph_id . clone ( ) ;
28
- let response_data = client. post :: < FetchSubgraphQuery > ( variables) ?;
29
- let services = get_services_from_response_data ( response_data, graph) ?;
30
- get_sdl_for_service ( services, subgraph)
31
- // if we want json, we can parse & serialize it here
24
+ ) -> Result < SubgraphFetchResponse , RoverClientError > {
25
+ let variables: SubgraphFetchVariables = input. clone ( ) . into ( ) ;
26
+ let response_data = client. post :: < SubgraphFetchQuery > ( variables. into ( ) ) ?;
27
+ get_sdl_from_response_data ( input, response_data)
28
+ }
29
+
30
+ fn get_sdl_from_response_data (
31
+ input : SubgraphFetchInput ,
32
+ response_data : SubgraphFetchResponseData ,
33
+ ) -> Result < SubgraphFetchResponse , RoverClientError > {
34
+ let service_list = get_services_from_response_data ( & input. graph_id , response_data) ?;
35
+ let sdl = get_sdl_for_service ( & input. subgraph , service_list) ?;
36
+ Ok ( SubgraphFetchResponse { sdl } )
32
37
}
33
38
34
- type ServiceList = Vec < fetch_subgraph_query:: FetchSubgraphQueryServiceImplementingServicesOnFederatedImplementingServicesServices > ;
35
39
fn get_services_from_response_data (
36
- response_data : fetch_subgraph_query :: ResponseData ,
37
- graph : String ,
40
+ graph_id : & str ,
41
+ response_data : SubgraphFetchResponseData ,
38
42
) -> Result < ServiceList , RoverClientError > {
39
43
let service_data = response_data. service . ok_or ( RoverClientError :: NoService {
40
- graph : graph . clone ( ) ,
44
+ graph : graph_id . to_string ( ) ,
41
45
} ) ?;
42
46
43
47
// get list of services
44
48
let services = match service_data. implementing_services {
45
49
Some ( services) => Ok ( services) ,
46
- // this case may be removable in the near future as unreachable, since
47
- // you should still get an `implementingServices` response in the case
48
- // of a non-federated graph. Fow now, this case still exists, but
49
- // wont' for long. Check on this later (Jake) :)
50
50
None => Err ( RoverClientError :: ExpectedFederatedGraph {
51
- graph : graph . clone ( ) ,
51
+ graph : graph_id . to_string ( ) ,
52
52
can_operation_convert : false ,
53
53
} ) ,
54
54
} ?;
55
55
56
56
match services {
57
- fetch_subgraph_query:: FetchSubgraphQueryServiceImplementingServices :: FederatedImplementingServices ( services) => {
58
- Ok ( services. services )
59
- } ,
60
- fetch_subgraph_query:: FetchSubgraphQueryServiceImplementingServices :: NonFederatedImplementingService => {
61
- Err ( RoverClientError :: ExpectedFederatedGraph { graph, can_operation_convert : false } )
57
+ Services :: FederatedImplementingServices ( services) => Ok ( services. services ) ,
58
+ Services :: NonFederatedImplementingService => {
59
+ Err ( RoverClientError :: ExpectedFederatedGraph {
60
+ graph : graph_id. to_string ( ) ,
61
+ can_operation_convert : false ,
62
+ } )
62
63
}
63
64
}
64
65
}
65
66
66
- fn get_sdl_for_service ( services : ServiceList , subgraph : & str ) -> Result < String , RoverClientError > {
67
+ fn get_sdl_for_service (
68
+ subgraph_name : & str ,
69
+ services : ServiceList ,
70
+ ) -> Result < String , RoverClientError > {
67
71
// find the right service by name
68
- let service = services. iter ( ) . find ( |svc| svc. name == subgraph ) ;
72
+ let service = services. iter ( ) . find ( |svc| svc. name == subgraph_name ) ;
69
73
70
74
// if there is a service, get it's active sdl, otherwise, error and list
71
75
// available services to fetch
@@ -75,7 +79,7 @@ fn get_sdl_for_service(services: ServiceList, subgraph: &str) -> Result<String,
75
79
let valid_subgraphs: Vec < String > = services. iter ( ) . map ( |svc| svc. name . clone ( ) ) . collect ( ) ;
76
80
77
81
Err ( RoverClientError :: NoSubgraphInGraph {
78
- invalid_subgraph : subgraph . to_string ( ) ,
82
+ invalid_subgraph : subgraph_name . to_string ( ) ,
79
83
valid_subgraphs,
80
84
} )
81
85
}
@@ -109,9 +113,8 @@ mod tests {
109
113
}
110
114
}
111
115
} ) ;
112
- let data: fetch_subgraph_query:: ResponseData =
113
- serde_json:: from_value ( json_response) . unwrap ( ) ;
114
- let output = get_services_from_response_data ( data, "mygraph" . to_string ( ) ) ;
116
+ let data: SubgraphFetchResponseData = serde_json:: from_value ( json_response) . unwrap ( ) ;
117
+ let output = get_services_from_response_data ( "mygraph" , data) ;
115
118
116
119
let expected_json = json ! ( [
117
120
{
@@ -140,9 +143,8 @@ mod tests {
140
143
"implementingServices" : null
141
144
}
142
145
} ) ;
143
- let data: fetch_subgraph_query:: ResponseData =
144
- serde_json:: from_value ( json_response) . unwrap ( ) ;
145
- let output = get_services_from_response_data ( data, "mygraph" . to_string ( ) ) ;
146
+ let data: SubgraphFetchResponseData = serde_json:: from_value ( json_response) . unwrap ( ) ;
147
+ let output = get_services_from_response_data ( "mygraph" , data) ;
146
148
assert ! ( output. is_err( ) ) ;
147
149
}
148
150
@@ -163,7 +165,7 @@ mod tests {
163
165
}
164
166
] ) ;
165
167
let service_list: ServiceList = serde_json:: from_value ( json_service_list) . unwrap ( ) ;
166
- let output = get_sdl_for_service ( service_list , "accounts2" ) ;
168
+ let output = get_sdl_for_service ( "accounts2" , service_list ) ;
167
169
assert_eq ! (
168
170
output. unwrap( ) ,
169
171
"extend type User @key(fields: \" id\" ) {\n id: ID! @external\n age: Int\n }\n "
@@ -188,7 +190,7 @@ mod tests {
188
190
}
189
191
] ) ;
190
192
let service_list: ServiceList = serde_json:: from_value ( json_service_list) . unwrap ( ) ;
191
- let output = get_sdl_for_service ( service_list , "harambe-was-an-inside-job" ) ;
193
+ let output = get_sdl_for_service ( "harambe-was-an-inside-job" , service_list ) ;
192
194
assert ! ( output. is_err( ) ) ;
193
195
}
194
196
}
0 commit comments