@@ -33,11 +33,11 @@ mod state {
33
33
use apollo_federation_types:: config:: { FederationVersion , SupergraphConfig } ;
34
34
use camino:: Utf8PathBuf ;
35
35
36
- pub struct LoadSupergraphConfig {
36
+ pub struct LoadRemoteSubgraphs {
37
37
pub federation_version : Option < FederationVersion > ,
38
38
}
39
- pub struct LoadRemoteSubgraphs {
40
- pub origin_path : Option < Utf8PathBuf > ,
39
+ pub struct LoadSupergraphConfig {
40
+ pub federation_version : Option < FederationVersion > ,
41
41
pub supergraph_config : Option < SupergraphConfig > ,
42
42
}
43
43
pub struct ResolveSubgraphs {
@@ -56,22 +56,59 @@ pub struct SupergraphConfigResolver<State> {
56
56
state : State ,
57
57
}
58
58
59
- impl SupergraphConfigResolver < LoadSupergraphConfig > {
59
+ impl SupergraphConfigResolver < LoadRemoteSubgraphs > {
60
60
pub fn new (
61
61
federation_version : Option < FederationVersion > ,
62
- ) -> SupergraphConfigResolver < LoadSupergraphConfig > {
62
+ ) -> SupergraphConfigResolver < LoadRemoteSubgraphs > {
63
63
SupergraphConfigResolver {
64
- state : LoadSupergraphConfig { federation_version } ,
64
+ state : LoadRemoteSubgraphs { federation_version } ,
65
65
}
66
66
}
67
67
}
68
68
69
- impl Default for SupergraphConfigResolver < LoadSupergraphConfig > {
69
+ impl Default for SupergraphConfigResolver < LoadRemoteSubgraphs > {
70
70
fn default ( ) -> Self {
71
71
Self :: new ( None )
72
72
}
73
73
}
74
74
75
+ #[ derive( thiserror:: Error , Debug ) ]
76
+ pub enum LoadRemoteSubgraphsError {
77
+ #[ error( transparent) ]
78
+ FetchRemoteSubgraphsError ( Box < dyn std:: error:: Error + Send + Sync > ) ,
79
+ }
80
+
81
+ impl SupergraphConfigResolver < LoadRemoteSubgraphs > {
82
+ pub async fn load_remote_subgraphs (
83
+ self ,
84
+ fetch_remote_subgraphs_impl : & impl FetchRemoteSubgraphs ,
85
+ graph_ref : Option < & GraphRef > ,
86
+ ) -> Result < SupergraphConfigResolver < LoadSupergraphConfig > , LoadRemoteSubgraphsError > {
87
+ if let Some ( graph_ref) = graph_ref {
88
+ let remote_subgraphs = fetch_remote_subgraphs_impl
89
+ . fetch_remote_subgraphs ( graph_ref)
90
+ . await
91
+ . map_err ( |err| {
92
+ LoadRemoteSubgraphsError :: FetchRemoteSubgraphsError ( Box :: new ( err) )
93
+ } ) ?;
94
+ let remote_supergraph_config = SupergraphConfig :: new ( remote_subgraphs, None ) ;
95
+ Ok ( SupergraphConfigResolver {
96
+ state : LoadSupergraphConfig {
97
+ federation_version : self . state . federation_version ,
98
+ supergraph_config : Some ( remote_supergraph_config) ,
99
+ } ,
100
+ } )
101
+ } else {
102
+ Ok ( SupergraphConfigResolver {
103
+ state : LoadSupergraphConfig {
104
+ federation_version : self . state . federation_version ,
105
+ supergraph_config : None ,
106
+ } ,
107
+ } )
108
+ }
109
+ }
110
+ }
111
+
75
112
#[ derive( thiserror:: Error , Debug ) ]
76
113
pub enum LoadSupergraphConfigError {
77
114
#[ error( "Failed to parse the supergraph config. Error: {0}" ) ]
@@ -85,7 +122,7 @@ impl SupergraphConfigResolver<LoadSupergraphConfig> {
85
122
self ,
86
123
read_stdin_impl : & mut impl ReadStdin ,
87
124
file_descriptor_type : Option < & FileDescriptorType > ,
88
- ) -> Result < SupergraphConfigResolver < LoadRemoteSubgraphs > , LoadSupergraphConfigError > {
125
+ ) -> Result < SupergraphConfigResolver < ResolveSubgraphs > , LoadSupergraphConfigError > {
89
126
if let Some ( file_descriptor_type) = file_descriptor_type {
90
127
let mut supergraph_config = file_descriptor_type
91
128
. read_file_descriptor ( "supergraph config" , read_stdin_impl)
@@ -98,63 +135,38 @@ impl SupergraphConfigResolver<LoadSupergraphConfig> {
98
135
FileDescriptorType :: File ( file) => Some ( file. clone ( ) ) ,
99
136
FileDescriptorType :: Stdin => None ,
100
137
} ;
101
- if let Some ( federation_version) = self . state . federation_version {
102
- supergraph_config. set_federation_version ( federation_version) ;
138
+ if let Some ( federation_version) = & self . state . federation_version {
139
+ supergraph_config. set_federation_version ( federation_version. clone ( ) ) ;
103
140
}
104
- Ok ( SupergraphConfigResolver {
105
- state : LoadRemoteSubgraphs {
106
- origin_path,
107
- supergraph_config : Some ( supergraph_config) ,
108
- } ,
109
- } )
110
- } else {
111
- Ok ( SupergraphConfigResolver {
112
- state : LoadRemoteSubgraphs {
113
- origin_path : None ,
114
- supergraph_config : None ,
115
- } ,
116
- } )
117
- }
118
- }
119
- }
120
-
121
- #[ derive( thiserror:: Error , Debug ) ]
122
- pub enum LoadRemoteSubgraphsError {
123
- #[ error( transparent) ]
124
- FetchRemoteSubgraphsError ( Box < dyn std:: error:: Error + Send + Sync > ) ,
125
- }
126
-
127
- impl SupergraphConfigResolver < LoadRemoteSubgraphs > {
128
- pub async fn load_remote_subgraphs (
129
- self ,
130
- fetch_remote_subgraphs_impl : & impl FetchRemoteSubgraphs ,
131
- graph_ref : Option < & GraphRef > ,
132
- ) -> Result < SupergraphConfigResolver < ResolveSubgraphs > , LoadRemoteSubgraphsError > {
133
- if let Some ( graph_ref) = graph_ref {
134
- let remote_supergraph_config = fetch_remote_subgraphs_impl
135
- . fetch_remote_subgraphs ( graph_ref)
136
- . await
137
- . map_err ( |err| {
138
- LoadRemoteSubgraphsError :: FetchRemoteSubgraphsError ( Box :: new ( err) )
139
- } ) ?;
140
141
Ok ( SupergraphConfigResolver {
141
142
state : ResolveSubgraphs {
142
- origin_path : self . state . origin_path ,
143
+ origin_path,
143
144
supergraph_config : self
144
145
. state
145
146
. supergraph_config
146
- . map ( |mut supergraph_config| {
147
- supergraph_config. merge_subgraphs ( & remote_supergraph_config) ;
148
- supergraph_config
147
+ . map ( |mut remote_supergraph_config| {
148
+ remote_supergraph_config. merge_subgraphs ( & supergraph_config) ;
149
+ if let Some ( federation_version) =
150
+ supergraph_config. get_federation_version ( )
151
+ {
152
+ remote_supergraph_config. set_federation_version ( federation_version) ;
153
+ }
154
+ remote_supergraph_config
149
155
} )
150
- . or_else ( || Some ( remote_supergraph_config ) ) ,
156
+ . or_else ( || Some ( supergraph_config ) ) ,
151
157
} ,
152
158
} )
153
159
} else {
160
+ let supergraph_config = self . state . supergraph_config . map ( |mut supergraph_config| {
161
+ if let Some ( federation_version) = & self . state . federation_version {
162
+ supergraph_config. set_federation_version ( federation_version. clone ( ) ) ;
163
+ }
164
+ supergraph_config
165
+ } ) ;
154
166
Ok ( SupergraphConfigResolver {
155
167
state : ResolveSubgraphs {
156
- origin_path : self . state . origin_path ,
157
- supergraph_config : self . state . supergraph_config ,
168
+ origin_path : None ,
169
+ supergraph_config,
158
170
} ,
159
171
} )
160
172
}
@@ -452,10 +464,6 @@ mod tests {
452
464
// init resolver with a target fed version
453
465
let resolver = SupergraphConfigResolver :: new ( Some ( target_federation_version. clone ( ) ) ) ;
454
466
455
- // load from the file descriptor
456
- let resolver = resolver
457
- . load_from_file_descriptor ( & mut mock_read_stdin, Some ( & file_descriptor_type) ) ?;
458
-
459
467
// determine whether to try to load from graph refs
460
468
let graph_ref = remote_subgraph_scenario
461
469
. as_ref ( )
@@ -472,6 +480,10 @@ mod tests {
472
480
. load_remote_subgraphs ( & mock_fetch_remote_subgraphs, graph_ref. as_ref ( ) )
473
481
. await ?;
474
482
483
+ // load from the file descriptor
484
+ let resolver = resolver
485
+ . load_from_file_descriptor ( & mut mock_read_stdin, Some ( & file_descriptor_type) ) ?;
486
+
475
487
// validate that the correct effect has been invoked
476
488
mock_fetch_remote_subgraphs. checkpoint ( ) ;
477
489
@@ -631,10 +643,6 @@ mod tests {
631
643
// init resolver with no target fed version
632
644
let resolver = SupergraphConfigResolver :: new ( None ) ;
633
645
634
- // load from the file descriptor
635
- let resolver = resolver
636
- . load_from_file_descriptor ( & mut mock_read_stdin, Some ( & file_descriptor_type) ) ?;
637
-
638
646
// determine whether to try to load from graph refs
639
647
let graph_ref = remote_subgraph_scenario
640
648
. as_ref ( )
@@ -651,6 +659,10 @@ mod tests {
651
659
. load_remote_subgraphs ( & mock_fetch_remote_subgraphs, graph_ref. as_ref ( ) )
652
660
. await ?;
653
661
662
+ // load from the file descriptor
663
+ let resolver = resolver
664
+ . load_from_file_descriptor ( & mut mock_read_stdin, Some ( & file_descriptor_type) ) ?;
665
+
654
666
// validate that the correct effect has been invoked
655
667
mock_fetch_remote_subgraphs. checkpoint ( ) ;
656
668
@@ -805,10 +817,6 @@ mod tests {
805
817
// init resolver with no target fed version
806
818
let resolver = SupergraphConfigResolver :: new ( None ) ;
807
819
808
- // load from the file descriptor
809
- let resolver = resolver
810
- . load_from_file_descriptor ( & mut mock_read_stdin, Some ( & file_descriptor_type) ) ?;
811
-
812
820
// determine whether to try to load from graph refs
813
821
let graph_ref = remote_subgraph_scenario
814
822
. as_ref ( )
@@ -825,6 +833,10 @@ mod tests {
825
833
. load_remote_subgraphs ( & mock_fetch_remote_subgraphs, graph_ref. as_ref ( ) )
826
834
. await ?;
827
835
836
+ // load from the file descriptor
837
+ let resolver = resolver
838
+ . load_from_file_descriptor ( & mut mock_read_stdin, Some ( & file_descriptor_type) ) ?;
839
+
828
840
// validate that the correct effect has been invoked
829
841
mock_fetch_remote_subgraphs. checkpoint ( ) ;
830
842
@@ -906,17 +918,12 @@ mod tests {
906
918
. times ( 1 )
907
919
. with ( predicate:: eq ( remote_subgraph_scenario. graph_ref . clone ( ) ) )
908
920
. returning ( {
909
- let remote_supergraph_federation_version =
910
- remote_supergraph_federation_version. clone ( ) ;
911
921
let subgraph_name = remote_subgraph_scenario. subgraph_name . to_string ( ) ;
912
922
move |_| {
913
- Ok ( SupergraphConfig :: new (
914
- BTreeMap :: from_iter ( [ (
915
- subgraph_name. to_string ( ) ,
916
- subgraph_config. clone ( ) ,
917
- ) ] ) ,
918
- remote_supergraph_federation_version. clone ( ) ,
919
- ) )
923
+ Ok ( BTreeMap :: from_iter ( [ (
924
+ subgraph_name. to_string ( ) ,
925
+ subgraph_config. clone ( ) ,
926
+ ) ] ) )
920
927
}
921
928
} ) ;
922
929
}
0 commit comments