Skip to content

Commit 66e012f

Browse files
danieljharveyhasura-bot
authored andcommitted
break out BooleanExpressionError from Error (#449)
<!-- Thank you for submitting this PR! :) --> ## Description Further breaking up the big error type. Functional no-op. V3_GIT_ORIGIN_REV_ID: d34acb7fd6421c250c214b133b8a107e03155c70
1 parent 6f8470c commit 66e012f

File tree

5 files changed

+121
-84
lines changed

5 files changed

+121
-84
lines changed

v3/crates/engine/src/metadata/resolved/error.rs

Lines changed: 61 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -263,51 +263,6 @@ pub enum Error {
263263
model_name: Qualified<ModelName>,
264264
type_representation: TypeRepresentation,
265265
},
266-
#[error("unknown type used in object boolean expression: {type_name:}")]
267-
UnknownTypeInObjectBooleanExpressionType {
268-
type_name: Qualified<CustomTypeName>,
269-
},
270-
#[error("unsupported type used in object boolean expression: {type_name:}; only object types are supported")]
271-
UnsupportedTypeInObjectBooleanExpressionType {
272-
type_name: Qualified<CustomTypeName>,
273-
},
274-
#[error("unknown data connector {data_connector:} referenced in object boolean expression type {boolean_expression_type:}")]
275-
UnknownDataConnectorInObjectBooleanExpressionType {
276-
data_connector: Qualified<DataConnectorName>,
277-
boolean_expression_type: Qualified<CustomTypeName>,
278-
},
279-
#[error("unknown data connector object type {data_connector_object_type:} (in data connector {data_connector:}) referenced in object boolean expression type {boolean_expression_type:}")]
280-
UnknownDataConnectorTypeInObjectBooleanExpressionType {
281-
data_connector: Qualified<DataConnectorName>,
282-
data_connector_object_type: String,
283-
boolean_expression_type: Qualified<CustomTypeName>,
284-
},
285-
#[error("unknown field '{field_name:}' used in object boolean expression type {boolean_expression_type:}")]
286-
UnknownFieldInObjectBooleanExpressionType {
287-
field_name: FieldName,
288-
boolean_expression_type: Qualified<CustomTypeName>,
289-
},
290-
#[error("the object type '{object_type:}' used in boolean expression type {boolean_expression_type:} does not have a mapping to object {data_connector_object_type:} of data connector {data_connector:}")]
291-
NoDataConnectorTypeMappingForObjectTypeInBooleanExpression {
292-
object_type: Qualified<CustomTypeName>,
293-
boolean_expression_type: Qualified<CustomTypeName>,
294-
data_connector_object_type: String,
295-
data_connector: Qualified<DataConnectorName>,
296-
},
297-
#[error("the following object boolean expression type is defined more than once: {name:}")]
298-
DuplicateObjectBooleanExpressionTypeDefinition { name: Qualified<CustomTypeName> },
299-
#[error("unknown object boolean expression type {name:} is used in model {model:}")]
300-
UnknownBooleanExpressionTypeInModel {
301-
name: Qualified<CustomTypeName>,
302-
model: Qualified<ModelName>,
303-
},
304-
#[error("the boolean expression type {name:} used in model {model:} corresponds to object type {boolean_expression_object_type:} whereas the model's object type is {model_object_type:}")]
305-
BooleanExpressionTypeForInvalidObjectTypeInModel {
306-
name: Qualified<CustomTypeName>,
307-
boolean_expression_object_type: Qualified<CustomTypeName>,
308-
model: Qualified<ModelName>,
309-
model_object_type: Qualified<CustomTypeName>,
310-
},
311266
#[error("a source must be defined for model {model:} in order to use filter expressions")]
312267
CannotUseFilterExpressionsWithoutSource { model: Qualified<ModelName> },
313268
#[error("graphql config must be defined for a filter expression to be used in a {model:}")]
@@ -582,6 +537,67 @@ pub enum Error {
582537
RelationshipError {
583538
relationship_error: RelationshipError,
584539
},
540+
#[error("{boolean_expression_error:}")]
541+
BooleanExpressionError {
542+
boolean_expression_error: BooleanExpressionError,
543+
},
544+
}
545+
546+
impl From<BooleanExpressionError> for Error {
547+
fn from(val: BooleanExpressionError) -> Self {
548+
Error::BooleanExpressionError {
549+
boolean_expression_error: val,
550+
}
551+
}
552+
}
553+
554+
#[derive(Debug, Error)]
555+
pub enum BooleanExpressionError {
556+
#[error("unknown type used in object boolean expression: {type_name:}")]
557+
UnknownTypeInObjectBooleanExpressionType {
558+
type_name: Qualified<CustomTypeName>,
559+
},
560+
#[error("unsupported type used in object boolean expression: {type_name:}; only object types are supported")]
561+
UnsupportedTypeInObjectBooleanExpressionType {
562+
type_name: Qualified<CustomTypeName>,
563+
},
564+
#[error("unknown data connector {data_connector:} referenced in object boolean expression type {boolean_expression_type:}")]
565+
UnknownDataConnectorInObjectBooleanExpressionType {
566+
data_connector: Qualified<DataConnectorName>,
567+
boolean_expression_type: Qualified<CustomTypeName>,
568+
},
569+
#[error("unknown data connector object type {data_connector_object_type:} (in data connector {data_connector:}) referenced in object boolean expression type {boolean_expression_type:}")]
570+
UnknownDataConnectorTypeInObjectBooleanExpressionType {
571+
data_connector: Qualified<DataConnectorName>,
572+
data_connector_object_type: String,
573+
boolean_expression_type: Qualified<CustomTypeName>,
574+
},
575+
#[error("unknown field '{field_name:}' used in object boolean expression type {boolean_expression_type:}")]
576+
UnknownFieldInObjectBooleanExpressionType {
577+
field_name: FieldName,
578+
boolean_expression_type: Qualified<CustomTypeName>,
579+
},
580+
#[error("the object type '{object_type:}' used in boolean expression type {boolean_expression_type:} does not have a mapping to object {data_connector_object_type:} of data connector {data_connector:}")]
581+
NoDataConnectorTypeMappingForObjectTypeInBooleanExpression {
582+
object_type: Qualified<CustomTypeName>,
583+
boolean_expression_type: Qualified<CustomTypeName>,
584+
data_connector_object_type: String,
585+
data_connector: Qualified<DataConnectorName>,
586+
},
587+
#[error("the following object boolean expression type is defined more than once: {name:}")]
588+
DuplicateObjectBooleanExpressionTypeDefinition { name: Qualified<CustomTypeName> },
589+
#[error("unknown object boolean expression type {name:} is used in model {model:}")]
590+
UnknownBooleanExpressionTypeInModel {
591+
name: Qualified<CustomTypeName>,
592+
model: Qualified<ModelName>,
593+
},
594+
#[error("the boolean expression type {name:} used in model {model:} corresponds to object type {boolean_expression_object_type:} whereas the model's object type is {model_object_type:}")]
595+
BooleanExpressionTypeForInvalidObjectTypeInModel {
596+
name: Qualified<CustomTypeName>,
597+
boolean_expression_object_type: Qualified<CustomTypeName>,
598+
model: Qualified<ModelName>,
599+
model_object_type: Qualified<CustomTypeName>,
600+
},
585601
}
586602

587603
#[derive(Debug, Error)]

v3/crates/engine/src/metadata/resolved/metadata.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::metadata::resolved::subgraph::Qualified;
1515

1616
use crate::metadata::resolved::command;
1717
use crate::metadata::resolved::data_connector::DataConnectorContext;
18-
use crate::metadata::resolved::error::Error;
18+
use crate::metadata::resolved::error::{BooleanExpressionError, Error};
1919
use crate::metadata::resolved::model::{
2020
resolve_model, resolve_model_graphql_api, resolve_model_select_permissions,
2121
resolve_model_source, Model,
@@ -486,9 +486,11 @@ fn resolve_boolean_expression_types(
486486
resolved_boolean_expression.name.clone(),
487487
resolved_boolean_expression,
488488
) {
489-
return Err(Error::DuplicateObjectBooleanExpressionTypeDefinition {
490-
name: existing.name,
491-
});
489+
return Err(Error::from(
490+
BooleanExpressionError::DuplicateObjectBooleanExpressionTypeDefinition {
491+
name: existing.name,
492+
},
493+
));
492494
}
493495
}
494496
Ok(boolean_expression_types)

v3/crates/engine/src/metadata/resolved/model.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use crate::metadata::resolved::argument::get_argument_mappings;
22
use crate::metadata::resolved::data_connector::get_simple_scalar;
33
use crate::metadata::resolved::data_connector::{DataConnectorContext, DataConnectorLink};
4-
use crate::metadata::resolved::error::{Error, GraphqlConfigError, RelationshipError};
4+
use crate::metadata::resolved::error::{
5+
BooleanExpressionError, Error, GraphqlConfigError, RelationshipError,
6+
};
57
use crate::metadata::resolved::ndc_validation;
68
use crate::metadata::resolved::stages::graphql_config::GraphqlConfig;
79
use crate::metadata::resolved::subgraph::{
@@ -210,17 +212,23 @@ fn resolve_filter_expression_type(
210212
Qualified::new(subgraph.to_string(), filter_expression_type.clone());
211213
let boolean_expression_type = boolean_expression_types
212214
.get(&boolean_expression_type_name)
213-
.ok_or_else(|| Error::UnknownBooleanExpressionTypeInModel {
214-
name: boolean_expression_type_name.clone(),
215-
model: Qualified::new(subgraph.to_string(), model.name.clone()),
215+
.ok_or_else(|| {
216+
Error::from(
217+
BooleanExpressionError::UnknownBooleanExpressionTypeInModel {
218+
name: boolean_expression_type_name.clone(),
219+
model: Qualified::new(subgraph.to_string(), model.name.clone()),
220+
},
221+
)
216222
})?;
217223
if boolean_expression_type.object_type != *model_data_type {
218-
return Err(Error::BooleanExpressionTypeForInvalidObjectTypeInModel {
219-
name: boolean_expression_type_name.clone(),
220-
boolean_expression_object_type: boolean_expression_type.object_type.clone(),
221-
model: Qualified::new(subgraph.to_string(), model.name.clone()),
222-
model_object_type: model_data_type.clone(),
223-
});
224+
return Err(Error::from(
225+
BooleanExpressionError::BooleanExpressionTypeForInvalidObjectTypeInModel {
226+
name: boolean_expression_type_name.clone(),
227+
boolean_expression_object_type: boolean_expression_type.object_type.clone(),
228+
model: Qualified::new(subgraph.to_string(), model.name.clone()),
229+
model_object_type: model_data_type.clone(),
230+
},
231+
));
224232
}
225233
// This is also checked in resolve_model_graphql_api, but we want to disallow this even
226234
// if the model is not used in the graphql layer.

v3/crates/engine/src/metadata/resolved/types.rs

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::metadata::resolved::error::{Error, TypeMappingValidationError};
1+
use crate::metadata::resolved::error::{BooleanExpressionError, Error, TypeMappingValidationError};
22
use crate::metadata::resolved::relationship::Relationship;
33
use crate::metadata::resolved::subgraph::{
44
mk_qualified_type_reference, Qualified, QualifiedBaseType, QualifiedTypeName,
@@ -504,17 +504,19 @@ pub(crate) fn resolve_object_boolean_expression_type(
504504
object_boolean_expression.object_type.to_owned(),
505505
);
506506
let type_representation = types.get(&qualified_object_type_name).ok_or_else(|| {
507-
Error::UnknownTypeInObjectBooleanExpressionType {
508-
type_name: qualified_object_type_name.clone(),
509-
}
507+
Error::from(
508+
BooleanExpressionError::UnknownTypeInObjectBooleanExpressionType {
509+
type_name: qualified_object_type_name.clone(),
510+
},
511+
)
510512
})?;
511513
match type_representation {
512514
// validate it should only be an object type
513-
TypeRepresentation::ScalarType { .. } => {
514-
Err(Error::UnsupportedTypeInObjectBooleanExpressionType {
515+
TypeRepresentation::ScalarType { .. } => Err(Error::from(
516+
BooleanExpressionError::UnsupportedTypeInObjectBooleanExpressionType {
515517
type_name: qualified_name.clone(),
516-
})
517-
}
518+
},
519+
)),
518520
TypeRepresentation::Object(object_type_representation) => {
519521
let qualified_data_connector_name = Qualified::new(
520522
subgraph.to_string(),
@@ -524,28 +526,30 @@ pub(crate) fn resolve_object_boolean_expression_type(
524526
// validate data connector name
525527
let data_connector_context = data_connectors
526528
.get(&qualified_data_connector_name)
527-
.ok_or_else(
528-
|| Error::UnknownDataConnectorInObjectBooleanExpressionType {
529-
data_connector: qualified_data_connector_name.clone(),
530-
boolean_expression_type: qualified_name.clone(),
531-
},
532-
)?;
529+
.ok_or_else(|| {
530+
Error::from(
531+
BooleanExpressionError::UnknownDataConnectorInObjectBooleanExpressionType {
532+
data_connector: qualified_data_connector_name.clone(),
533+
boolean_expression_type: qualified_name.clone(),
534+
},
535+
)
536+
})?;
533537

534538
// validate data connector object type
535539
if !data_connector_context
536540
.schema
537541
.object_types
538542
.contains_key(&object_boolean_expression.data_connector_object_type)
539543
{
540-
return Err(
541-
Error::UnknownDataConnectorTypeInObjectBooleanExpressionType {
544+
return Err(Error::from(
545+
BooleanExpressionError::UnknownDataConnectorTypeInObjectBooleanExpressionType {
542546
data_connector: qualified_data_connector_name.clone(),
543547
boolean_expression_type: qualified_name.clone(),
544548
data_connector_object_type: object_boolean_expression
545549
.data_connector_object_type
546550
.clone(),
547551
},
548-
);
552+
));
549553
}
550554

551555
data_connector_type_mappings
@@ -555,14 +559,14 @@ pub(crate) fn resolve_object_boolean_expression_type(
555559
&object_boolean_expression.data_connector_object_type,
556560
)
557561
.ok_or_else(|| {
558-
Error::NoDataConnectorTypeMappingForObjectTypeInBooleanExpression {
562+
Error::from(BooleanExpressionError::NoDataConnectorTypeMappingForObjectTypeInBooleanExpression {
559563
object_type: qualified_object_type_name.clone(),
560564
boolean_expression_type: qualified_name.clone(),
561565
data_connector_object_type: object_boolean_expression
562566
.data_connector_object_type
563567
.clone(),
564568
data_connector: qualified_data_connector_name.clone(),
565-
}
569+
})
566570
})?;
567571

568572
// validate comparable fields
@@ -571,10 +575,13 @@ pub(crate) fn resolve_object_boolean_expression_type(
571575
.fields
572576
.contains_key(&comparable_field.field_name)
573577
{
574-
return Err(Error::UnknownFieldInObjectBooleanExpressionType {
575-
field_name: comparable_field.field_name.clone(),
576-
boolean_expression_type: qualified_name.clone(),
577-
});
578+
return Err(
579+
BooleanExpressionError::UnknownFieldInObjectBooleanExpressionType {
580+
field_name: comparable_field.field_name.clone(),
581+
boolean_expression_type: qualified_name.clone(),
582+
}
583+
.into(),
584+
);
578585
}
579586

580587
// As of now, only `"enableAll": true` is allowed for field operators

v3/crates/engine/tests/validate_metadata.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::fs;
22
use std::path::PathBuf;
33

4+
use engine::metadata::resolved::error::BooleanExpressionError;
45
use engine::metadata::resolved::error::Error as ResolveError;
56
use engine::schema::Error as SchemaError;
67
use engine::schema::GDS;
@@ -267,7 +268,10 @@ fn test_disallow_filter_expression_with_object_type_mismatch() -> anyhow::Result
267268
matches!(
268269
gds,
269270
Err(SchemaError::ResolveError {
270-
error: ResolveError::BooleanExpressionTypeForInvalidObjectTypeInModel { .. }
271+
error: ResolveError::BooleanExpressionError {
272+
boolean_expression_error:
273+
BooleanExpressionError::BooleanExpressionTypeForInvalidObjectTypeInModel { .. }
274+
}
271275
})
272276
),
273277
"actual: {gds:?}"
@@ -323,7 +327,7 @@ fn test_disallow_boolean_expression_without_mapping() -> anyhow::Result<()> {
323327
matches!(
324328
gds,
325329
Err(SchemaError::ResolveError {
326-
error: ResolveError::NoDataConnectorTypeMappingForObjectTypeInBooleanExpression { .. }
330+
error: ResolveError::BooleanExpressionError { boolean_expression_error:BooleanExpressionError::NoDataConnectorTypeMappingForObjectTypeInBooleanExpression { .. }}
327331
})
328332
),
329333
"actual: {gds:?}"

0 commit comments

Comments
 (0)