skipped 10 lines 11 11 types::{CustomTypeName, TypeName}, 12 12 }; 13 13 14 - use crate::metadata::resolved::subgraph::Qualified; 15 - 16 14 use crate::metadata::resolved::command; 17 - use crate::metadata::resolved::data_connector::DataConnectorContext; 15 + 18 16 use crate::metadata::resolved::error::{BooleanExpressionError, Error}; 19 17 use crate::metadata::resolved::model::{ 20 18 resolve_model, resolve_model_graphql_api, resolve_model_select_permissions, 21 19 resolve_model_source, Model, 22 20 }; 23 21 use crate::metadata::resolved::relationship::resolve_relationship; 22 + use crate::metadata::resolved::subgraph::Qualified; 24 23 use crate::metadata::resolved::types::{ 25 24 mk_name, resolve_object_type, resolve_output_type_permission, store_new_graphql_type, 26 25 TypeRepresentation, skipped 3 lines 30 29 resolve_data_connector_type_mapping, resolve_object_boolean_expression_type, 31 30 ObjectBooleanExpressionType, ScalarTypeRepresentation, TypeMapping, 32 31 }; 33 - use crate::metadata::resolved::stages::graphql_config : : {GlobalGraphqlConfig , GraphqlConfig }; 32 + use crate::metadata::resolved::stages::{data_connectors , graphql_config }; 34 33 35 34 /// Resolved and validated metadata for a project. Used internally in the v3 server. 36 35 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] skipped 2 lines 39 38 pub models: IndexMap<Qualified<ModelName>, Model>, 40 39 pub commands: IndexMap<Qualified<CommandName>, command::Command>, 41 40 pub boolean_expression_types: HashMap<Qualified<CustomTypeName>, ObjectBooleanExpressionType>, 42 - pub graphql_config: GlobalGraphqlConfig, 41 + pub graphql_config: graphql_config : : GlobalGraphqlConfig, 43 42 } 44 43 45 44 pub type DataConnectorTypeMappingsForObjectType = skipped 61 lines 107 106 Functions to validate and resolve OpenDD spec to internal metadata 108 107 *******************/ 109 108 pub fn resolve_metadata( 110 - metadata_accessor: open_dds::accessor::MetadataAccessor, 111 - graphql_config: GraphqlConfig, 109 + metadata_accessor: & open_dds::accessor::MetadataAccessor, 110 + graphql_config: graphql_config : : GraphqlConfig, 111 + mut data_connectors: data_connectors::DataConnectors, 112 112 ) -> Result<Metadata, Error> { 113 - // resolve data connectors 114 - let mut data_connectors = resolve_data_connectors(&metadata_accessor)?; 115 - 116 113 let mut existing_graphql_types: HashSet<ast::TypeName> = HashSet::new(); 117 114 118 115 // we collect all the types with global id fields, and models with global id source for that field. this is used skipped 8 lines 127 124 128 125 // resolve object types 129 126 let (data_connector_type_mappings, types) = resolve_data_connector_type_mappings_and_objects( 130 - & metadata_accessor, 127 + metadata_accessor, 131 128 &data_connectors, 132 129 &mut existing_graphql_types, 133 130 &mut global_id_enabled_types, skipped 1 lines 135 132 )?; 136 133 137 134 // resolve scalar types 138 - let scalar_types = resolve_scalar_types(& metadata_accessor, &mut existing_graphql_types)?; 135 + let scalar_types = resolve_scalar_types(metadata_accessor, &mut existing_graphql_types)?; 139 136 140 137 // resolve type permissions 141 - let types = resolve_type_permissions(& metadata_accessor, extend_types(types, scalar_types)?)?; 138 + let types = resolve_type_permissions(metadata_accessor, extend_types(types, scalar_types)?)?; 142 139 143 140 // resolve object boolean expression types 144 141 let boolean_expression_types = resolve_boolean_expression_types( 145 - & metadata_accessor, 142 + metadata_accessor, 146 143 &data_connectors, 147 144 &data_connector_type_mappings, 148 145 &types, skipped 3 lines 152 149 // resolve data connector scalar representations 153 150 // TODO: make this return values rather than blindly mutating it's inputs 154 151 resolve_data_connector_scalar_representations( 155 - & metadata_accessor, 152 + metadata_accessor, 156 153 &mut data_connectors, 157 154 &types, 158 155 &mut existing_graphql_types, skipped 2 lines 161 158 // resolve models 162 159 // TODO: validate types 163 160 let mut models = resolve_models( 164 - & metadata_accessor, 161 + metadata_accessor, 165 162 &data_connectors, 166 163 &data_connector_type_mappings, 167 164 &types, skipped 23 lines 191 188 192 189 // resolve commands 193 190 let mut commands = resolve_commands( 194 - & metadata_accessor, 191 + metadata_accessor, 195 192 &data_connectors, 196 193 &data_connector_type_mappings, 197 194 &types, skipped 1 lines 199 196 200 197 // resolve relationships 201 198 let types = resolve_relationships( 202 - & metadata_accessor, 199 + metadata_accessor, 203 200 &data_connectors, 204 201 types, 205 202 &models, skipped 2 lines 208 205 209 206 // resolve command permissions 210 207 // TODO: make this return values rather than blindly mutating it's inputs 211 - resolve_command_permissions(& metadata_accessor, &mut commands)?; 208 + resolve_command_permissions(metadata_accessor, &mut commands)?; 212 209 213 210 // resolve model permissions 214 211 // Note: Model permissions's predicate can include the relationship field, 215 212 // hence Model permissions should be resolved after the relationships of a 216 213 // model is resolved. 217 214 // TODO: make this return values rather than blindly mutating it's inputs 218 - resolve_model_permissions(& metadata_accessor, &data_connectors, &types, &mut models)?; 215 + resolve_model_permissions(metadata_accessor, &data_connectors, &types, &mut models)?; 219 216 220 217 Ok(Metadata { 221 218 types, skipped 7 lines 229 226 /// resolve commands 230 227 fn resolve_commands( 231 228 metadata_accessor: &open_dds::accessor::MetadataAccessor, 232 - data_connectors: &HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 229 + data_connectors: &data_connectors::DataConnectors, 233 230 data_connector_type_mappings: &DataConnectorTypeMappings, 234 231 types: &HashMap<Qualified<CustomTypeName>, TypeRepresentation>, 235 232 ) -> Result<IndexMap<Qualified<CommandName>, command::Command>, Error> { skipped 27 lines 263 260 Ok(commands) 264 261 } 265 262 266 - /// resolve data connectors 267 - fn resolve_data_connectors( 268 - metadata_accessor: &open_dds::accessor::MetadataAccessor, 269 - ) -> Result<HashMap<Qualified<DataConnectorName>, DataConnectorContext>, Error> { 270 - let mut data_connectors = HashMap::new(); 271 - for open_dds::accessor::QualifiedObject { 272 - subgraph, 273 - object: data_connector, 274 - } in &metadata_accessor.data_connectors 275 - { 276 - let qualified_data_connector_name = 277 - Qualified::new(subgraph.to_string(), data_connector.name.clone()); 278 - if data_connectors 279 - .insert( 280 - qualified_data_connector_name.clone(), 281 - DataConnectorContext::new(data_connector)?, 282 - ) 283 - .is_some() 284 - { 285 - return Err(Error::DuplicateDataConnectorDefinition { 286 - name: qualified_data_connector_name, 287 - }); 288 - } 289 - } 290 - Ok(data_connectors) 291 - } 292 - 293 263 /// resolve object types, matching them to that in the data connectors 294 264 /// this currently works by mutating `types` and `existing_graphql_types`, we should try 295 265 /// and change this to return new values here and make the caller combine them together 296 266 fn resolve_data_connector_type_mappings_and_objects( 297 267 metadata_accessor: &open_dds::accessor::MetadataAccessor, 298 - data_connectors: &HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 268 + data_connectors: &data_connectors::DataConnectors, 299 269 existing_graphql_types: &mut HashSet<ast::TypeName>, 300 270 global_id_enabled_types: &mut HashMap<Qualified<CustomTypeName>, Vec<Qualified<ModelName>>>, 301 271 apollo_federation_entity_enabled_types: &mut HashMap< skipped 161 lines 463 433 /// resolve object boolean expression types 464 434 fn resolve_boolean_expression_types( 465 435 metadata_accessor: &open_dds::accessor::MetadataAccessor, 466 - data_connectors: &HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 436 + data_connectors: &data_connectors::DataConnectors, 467 437 data_connector_type_mappings: &DataConnectorTypeMappings, 468 438 types: &HashMap<Qualified<CustomTypeName>, TypeRepresentation>, 469 439 existing_graphql_types: &mut HashSet<ast::TypeName>, skipped 31 lines 501 471 /// return new values instead if possible 502 472 fn resolve_data_connector_scalar_representations( 503 473 metadata_accessor: &open_dds::accessor::MetadataAccessor, 504 - data_connectors: &mut HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 474 + data_connectors: &mut data_connectors::DataConnectors, 505 475 types: &HashMap<Qualified<CustomTypeName>, TypeRepresentation>, 506 476 existing_graphql_types: &mut HashSet<ast::TypeName>, 507 477 ) -> Result<(), Error> { skipped 8 lines 516 486 scalar_type_representation.data_connector_name.to_owned(), 517 487 ); 518 488 let connector_context = data_connectors 489 + .data_connectors 519 490 .get_mut(&qualified_data_connector_name) 520 491 .ok_or_else(|| Error::ScalarTypeFromUnknownDataConnector { 521 492 scalar_type: scalar_type_name.clone(), skipped 56 lines 578 549 /// resolve models 579 550 fn resolve_models( 580 551 metadata_accessor: &open_dds::accessor::MetadataAccessor, 581 - data_connectors: &HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 552 + data_connectors: &data_connectors::DataConnectors, 582 553 data_connector_type_mappings: &DataConnectorTypeMappings, 583 554 types: &HashMap<Qualified<CustomTypeName>, TypeRepresentation>, 584 555 existing_graphql_types: &mut HashSet<ast::TypeName>, skipped 3 lines 588 559 Option<Qualified<open_dds::models::ModelName>>, 589 560 >, 590 561 boolean_expression_types: &HashMap<Qualified<CustomTypeName>, ObjectBooleanExpressionType>, 591 - graphql_config: &GraphqlConfig, 562 + graphql_config: &graphql_config : : GraphqlConfig, 592 563 ) -> Result<IndexMap<Qualified<ModelName>, Model>, Error> { 593 564 // resolve models 594 565 // TODO: validate types skipped 67 lines 662 633 /// returns updated `types` value 663 634 fn resolve_relationships( 664 635 metadata_accessor: &open_dds::accessor::MetadataAccessor, 665 - data_connectors: &HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 636 + data_connectors: &data_connectors::DataConnectors, 666 637 mut types: HashMap<Qualified<CustomTypeName>, TypeRepresentation>, 667 638 models: &IndexMap<Qualified<ModelName>, Model>, 668 639 commands: &IndexMap<Qualified<CommandName>, command::Command>, skipped 84 lines 753 724 /// return new values instead where possible 754 725 fn resolve_model_permissions( 755 726 metadata_accessor: &open_dds::accessor::MetadataAccessor, 756 - data_connectors: &HashMap<Qualified<DataConnectorName>, DataConnectorContext>, 727 + data_connectors: &data_connectors::DataConnectors, 757 728 types: &HashMap<Qualified<CustomTypeName>, TypeRepresentation>, 758 729 models: &mut IndexMap<Qualified<ModelName>, Model>, 759 730 ) -> Result<(), Error> { skipped 40 lines