@@ -1084,21 +1084,58 @@ impl<'a> ObjectBuilder<'a> {
1084
1084
key : & str ,
1085
1085
value : T ,
1086
1086
) -> Result < ( ) , ArrowError > {
1087
- // Get metadata_builder from parent state
1088
- let metadata_builder = self . parent_state . metadata_builder ( ) ;
1087
+ match & mut self . parent_state {
1088
+ ParentState :: Variant {
1089
+ buffer,
1090
+ metadata_builder,
1091
+ } => {
1092
+ let field_id = metadata_builder. upsert_field_name ( key) ;
1093
+ let field_start = buffer. offset ( ) - self . object_start_offset ;
1089
1094
1090
- let field_id = metadata_builder. upsert_field_name ( key) ;
1091
- // field_start is a relevant offset from the buffer this object is being built in.
1092
- let field_start = self . parent_state . buffer ( ) . offset ( ) - self . object_start_offset ;
1095
+ if self . fields . insert ( field_id, field_start) . is_some ( )
1096
+ && self . validate_unique_fields
1097
+ {
1098
+ self . duplicate_fields . insert ( field_id) ;
1099
+ }
1093
1100
1094
- if self . fields . insert ( field_id, field_start) . is_some ( ) && self . validate_unique_fields {
1095
- self . duplicate_fields . insert ( field_id) ;
1096
- }
1101
+ buffer. try_append_variant ( value. into ( ) , metadata_builder) ?;
1102
+ Ok ( ( ) )
1103
+ }
1104
+ ParentState :: List {
1105
+ buffer,
1106
+ metadata_builder,
1107
+ ..
1108
+ } => {
1109
+ let field_id = metadata_builder. upsert_field_name ( key) ;
1110
+ let field_start = buffer. offset ( ) - self . object_start_offset ;
1097
1111
1098
- self . parent_state . buffer ( )
1099
- . try_append_variant ( value. into ( ) , metadata_builder) ?;
1112
+ if self . fields . insert ( field_id, field_start) . is_some ( )
1113
+ && self . validate_unique_fields
1114
+ {
1115
+ self . duplicate_fields . insert ( field_id) ;
1116
+ }
1100
1117
1101
- Ok ( ( ) )
1118
+ buffer. try_append_variant ( value. into ( ) , metadata_builder) ?;
1119
+ Ok ( ( ) )
1120
+ }
1121
+ ParentState :: Object {
1122
+ buffer,
1123
+ metadata_builder,
1124
+ ..
1125
+ } => {
1126
+ let field_id = metadata_builder. upsert_field_name ( key) ;
1127
+ let field_start = buffer. offset ( ) - self . object_start_offset ;
1128
+
1129
+ if self . fields . insert ( field_id, field_start) . is_some ( )
1130
+ && self . validate_unique_fields
1131
+ {
1132
+ self . duplicate_fields . insert ( field_id) ;
1133
+ }
1134
+
1135
+ buffer. try_append_variant ( value. into ( ) , metadata_builder) ?;
1136
+ Ok ( ( ) )
1137
+ }
1138
+ }
1102
1139
}
1103
1140
1104
1141
/// Enables validation for unique field keys when inserting into this object.
@@ -1936,7 +1973,13 @@ mod tests {
1936
1973
{
1937
1974
"a": false,
1938
1975
"c": {
1939
- "b": "a"
1976
+ "b": "a",
1977
+ "c": {
1978
+ "aa": "bb",
1979
+ },
1980
+ "d": {
1981
+ "cc": "dd"
1982
+ }
1940
1983
}
1941
1984
"b": true,
1942
1985
}
@@ -1951,6 +1994,18 @@ mod tests {
1951
1994
{
1952
1995
let mut inner_object_builder = outer_object_builder. new_object ( "c" ) ;
1953
1996
inner_object_builder. insert ( "b" , "a" ) ;
1997
+
1998
+ {
1999
+ let mut inner_inner_object_builder = inner_object_builder. new_object ( "c" ) ;
2000
+ inner_inner_object_builder. insert ( "aa" , "bb" ) ;
2001
+ let _ = inner_inner_object_builder. finish ( ) ;
2002
+ }
2003
+
2004
+ {
2005
+ let mut inner_inner_object_builder = inner_object_builder. new_object ( "d" ) ;
2006
+ inner_inner_object_builder. insert ( "cc" , "dd" ) ;
2007
+ let _ = inner_inner_object_builder. finish ( ) ;
2008
+ }
1954
2009
let _ = inner_object_builder. finish ( ) ;
1955
2010
}
1956
2011
@@ -1967,7 +2022,13 @@ mod tests {
1967
2022
"a": false,
1968
2023
"b": true,
1969
2024
"c": {
1970
- "b": "a"
2025
+ "b": "a",
2026
+ "c": {
2027
+ "aa": "bb",
2028
+ },
2029
+ "d": {
2030
+ "cc": "dd"
2031
+ }
1971
2032
}
1972
2033
}
1973
2034
*/
@@ -1985,10 +2046,22 @@ mod tests {
1985
2046
let inner_object_variant = outer_object. field ( 2 ) . unwrap ( ) ;
1986
2047
let inner_object = inner_object_variant. as_object ( ) . unwrap ( ) ;
1987
2048
1988
- assert_eq ! ( inner_object. len( ) , 1 ) ;
2049
+ assert_eq ! ( inner_object. len( ) , 3 ) ;
1989
2050
assert_eq ! ( inner_object. field_name( 0 ) . unwrap( ) , "b" ) ;
1990
2051
assert_eq ! ( inner_object. field( 0 ) . unwrap( ) , Variant :: from( "a" ) ) ;
1991
2052
2053
+ let inner_iner_object_variant_c = inner_object. field ( 1 ) . unwrap ( ) ;
2054
+ let inner_inner_object_c = inner_iner_object_variant_c. as_object ( ) . unwrap ( ) ;
2055
+ assert_eq ! ( inner_inner_object_c. len( ) , 1 ) ;
2056
+ assert_eq ! ( inner_inner_object_c. field_name( 0 ) . unwrap( ) , "aa" ) ;
2057
+ assert_eq ! ( inner_inner_object_c. field( 0 ) . unwrap( ) , Variant :: from( "bb" ) ) ;
2058
+
2059
+ let inner_iner_object_variant_d = inner_object. field ( 2 ) . unwrap ( ) ;
2060
+ let inner_inner_object_d = inner_iner_object_variant_d. as_object ( ) . unwrap ( ) ;
2061
+ assert_eq ! ( inner_inner_object_d. len( ) , 1 ) ;
2062
+ assert_eq ! ( inner_inner_object_d. field_name( 0 ) . unwrap( ) , "cc" ) ;
2063
+ assert_eq ! ( inner_inner_object_d. field( 0 ) . unwrap( ) , Variant :: from( "dd" ) ) ;
2064
+
1992
2065
assert_eq ! ( outer_object. field_name( 1 ) . unwrap( ) , "b" ) ;
1993
2066
assert_eq ! ( outer_object. field( 1 ) . unwrap( ) , Variant :: from( true ) ) ;
1994
2067
}
0 commit comments