From be856c23b83a9ef879b250b348881ba7766c7abe Mon Sep 17 00:00:00 2001 From: Khushboo <68757952+desaikd@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:01:01 -0700 Subject: [PATCH] Add support for programmatically adding closed `fields` (#218) --- ion-schema/src/isl/isl_constraint.rs | 5 +++-- ion-schema/src/isl/mod.rs | 14 ++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ion-schema/src/isl/isl_constraint.rs b/ion-schema/src/isl/isl_constraint.rs index e4aec45..f427283 100644 --- a/ion-schema/src/isl/isl_constraint.rs +++ b/ion-schema/src/isl/isl_constraint.rs @@ -272,13 +272,14 @@ pub mod v_2_0 { } /// Creates a `fields` constraint using the field names and [IslVariablyOccurringTypeRef]s referenced inside it - pub fn fields(fields: I) -> IslConstraint + /// and specify if the `fields` are closed or not (i.e. indicates whether only fields that are explicitly specified should be allowed or not). + pub fn fields(fields: I, is_closed: bool) -> IslConstraint where I: Iterator, { IslConstraint::new( IslVersion::V2_0, - IslConstraintValue::Fields(fields.collect(), false), + IslConstraintValue::Fields(fields.collect(), is_closed), ) } diff --git a/ion-schema/src/isl/mod.rs b/ion-schema/src/isl/mod.rs index 8742c63..0c0fae0 100644 --- a/ion-schema/src/isl/mod.rs +++ b/ion-schema/src/isl/mod.rs @@ -501,12 +501,18 @@ mod isl_tests { "#), anonymous_type([ordered_elements([variably_occurring_type_ref(named_type_ref("symbol"), UsizeRange::new_single_value(1)), variably_occurring_type_ref(anonymous_type_ref([type_constraint(named_type_ref("int"))]), UsizeRange::new_single_value(1))])]) ), - case::fields_constraint( - load_isl_type(r#" // For a schema with fields constraint as below: - { fields: { name: string, id: int} } + case::closed_fields_constraint( + load_isl_type_v2_0(r#" // For a schema with fields constraint as below: + { fields: closed::{ name: string, id: int} } "#), - anonymous_type([fields(vec![("name".to_owned(), variably_occurring_type_ref(named_type_ref("string"), UsizeRange::zero_or_one())), ("id".to_owned(), variably_occurring_type_ref(named_type_ref("int"), UsizeRange::zero_or_one()))].into_iter())]), + anonymous_type([isl_constraint::v_2_0::fields(vec![("name".to_owned(), variably_occurring_type_ref(named_type_ref("string"), UsizeRange::zero_or_one())), ("id".to_owned(), variably_occurring_type_ref(named_type_ref("int"), UsizeRange::zero_or_one()))].into_iter(), true)]), ), + case::fields_constraint( + load_isl_type(r#" // For a schema with fields constraint as below: + { fields: { name: string, id: int} } + "#), + anonymous_type([fields(vec![("name".to_owned(), variably_occurring_type_ref(named_type_ref("string"), UsizeRange::zero_or_one())), ("id".to_owned(), variably_occurring_type_ref(named_type_ref("int"), UsizeRange::zero_or_one()))].into_iter())]), + ), case::field_names_constraint( load_isl_type_v2_0(r#" // For a schema with field_names constraint as below: { field_names: distinct::symbol }