@@ -18,11 +18,11 @@ use std::collections::BTreeMap;
1818
1919use jsonb:: {
2020 array_length, array_values, as_bool, as_null, as_number, as_str, build_array, build_object,
21- compare, concat, contains, convert_to_comparable, exists_all_keys , exists_any_keys , from_slice ,
22- get_by_index , get_by_keypath , get_by_name , get_by_path , is_array , is_object ,
23- keypath :: parse_key_paths , object_each , object_keys , parse_value , path_exists , path_match ,
24- strip_nulls , to_bool , to_f64 , to_i64 , to_pretty_string , to_str , to_string , to_u64 ,
25- traverse_check_string, type_of, Number , Object , Value ,
21+ compare, concat, contains, convert_to_comparable, delete_by_index , delete_by_name ,
22+ exists_all_keys , exists_any_keys , from_slice , get_by_index , get_by_keypath , get_by_name ,
23+ get_by_path , is_array , is_object , keypath :: parse_key_paths , object_each , object_keys ,
24+ parse_value , path_exists , path_match , strip_nulls , to_bool , to_f64 , to_i64 , to_pretty_string ,
25+ to_str , to_string , to_u64 , traverse_check_string, type_of, Error , Number , Object , Value ,
2626} ;
2727
2828use jsonb:: jsonpath:: parse_json_path;
@@ -1290,6 +1290,132 @@ fn test_concat() {
12901290 }
12911291}
12921292
1293+ #[ test]
1294+ fn test_delete_by_name ( ) {
1295+ let sources = vec ! [
1296+ ( "[1,2,3]" , "1" , "[1,2,3]" ) ,
1297+ ( r#"["1","2","3"]"# , "0" , r#"["1","2","3"]"# ) ,
1298+ ( r#"["1","2","3"]"# , "1" , r#"["2","3"]"# ) ,
1299+ (
1300+ r#"["1","2","3",{"a":1,"b":2}]"# ,
1301+ "1" ,
1302+ r#"["2","3",{"a":1,"b":2}]"# ,
1303+ ) ,
1304+ ( r#"{"a":1,"b":2}"# , "c" , r#"{"a":1,"b":2}"# ) ,
1305+ ( r#"{"a":1,"b":2}"# , "a" , r#"{"b":2}"# ) ,
1306+ ( r#"{"b":2}"# , "b" , "{}" ) ,
1307+ ] ;
1308+ for ( json, name, result) in sources {
1309+ {
1310+ let mut buf = Vec :: new ( ) ;
1311+ delete_by_name ( json. as_bytes ( ) , name, & mut buf) . unwrap ( ) ;
1312+
1313+ let actual = from_slice ( & buf) . unwrap ( ) ;
1314+ let expected = parse_value ( result. as_bytes ( ) ) . unwrap ( ) ;
1315+
1316+ assert_eq ! ( actual, expected) ;
1317+ }
1318+ {
1319+ let json = parse_value ( json. as_bytes ( ) ) . unwrap ( ) . to_vec ( ) ;
1320+ let mut buf = Vec :: new ( ) ;
1321+
1322+ delete_by_name ( & json, name, & mut buf) . unwrap ( ) ;
1323+
1324+ let actual = from_slice ( & buf) . unwrap ( ) ;
1325+ let expected = parse_value ( result. as_bytes ( ) ) . unwrap ( ) ;
1326+
1327+ assert_eq ! ( actual, expected) ;
1328+ }
1329+ }
1330+ }
1331+
1332+ #[ test]
1333+ fn test_delete_by_name_errors ( ) {
1334+ let sources = vec ! [ ( r#""asd""# , "asd" ) , ( "true" , "true" ) , ( "1" , "1" ) ] ;
1335+ for ( json, name) in sources {
1336+ {
1337+ let mut buf = Vec :: new ( ) ;
1338+ let result = delete_by_name ( json. as_bytes ( ) , name, & mut buf) ;
1339+
1340+ assert ! ( result. is_err( ) ) ;
1341+ assert ! ( matches!( result. unwrap_err( ) , Error :: InvalidJsonType ) ) ;
1342+ }
1343+ {
1344+ let json = parse_value ( json. as_bytes ( ) ) . unwrap ( ) . to_vec ( ) ;
1345+ let mut buf = Vec :: new ( ) ;
1346+
1347+ let result = delete_by_name ( & json, name, & mut buf) ;
1348+
1349+ assert ! ( result. is_err( ) ) ;
1350+ assert ! ( matches!( result. unwrap_err( ) , Error :: InvalidJsonType ) ) ;
1351+ }
1352+ }
1353+ }
1354+
1355+ #[ test]
1356+ fn test_delete_by_index ( ) {
1357+ let sources = vec ! [
1358+ ( "[1,2,3]" , 0 , "[2,3]" ) ,
1359+ ( "[1,2,3]" , 1 , "[1,3]" ) ,
1360+ ( "[1,2,3]" , 2 , "[1,2]" ) ,
1361+ ( "[1,2,3]" , -1 , "[1,2]" ) ,
1362+ ( "[1,2,3]" , -2 , "[1,3]" ) ,
1363+ ( "[1,2,3]" , -3 , "[2,3]" ) ,
1364+ ( "[1,2,3]" , -4 , "[1,2,3]" ) ,
1365+ ( r#"[1,2,{"a":[1,2,3],"b":[40,50,60]}]"# , 2 , "[1,2]" ) ,
1366+ ] ;
1367+ for ( json, index, result) in sources {
1368+ {
1369+ let mut buf = Vec :: new ( ) ;
1370+ delete_by_index ( json. as_bytes ( ) , index, & mut buf) . unwrap ( ) ;
1371+
1372+ let actual = from_slice ( & buf) . unwrap ( ) ;
1373+ let expected = parse_value ( result. as_bytes ( ) ) . unwrap ( ) ;
1374+
1375+ assert_eq ! ( actual, expected) ;
1376+ }
1377+ {
1378+ let json = parse_value ( json. as_bytes ( ) ) . unwrap ( ) . to_vec ( ) ;
1379+ let mut buf = Vec :: new ( ) ;
1380+
1381+ delete_by_index ( & json, index, & mut buf) . unwrap ( ) ;
1382+
1383+ let actual = from_slice ( & buf) . unwrap ( ) ;
1384+ let expected = parse_value ( result. as_bytes ( ) ) . unwrap ( ) ;
1385+
1386+ assert_eq ! ( actual, expected) ;
1387+ }
1388+ }
1389+ }
1390+
1391+ #[ test]
1392+ fn test_delete_by_index_errors ( ) {
1393+ let sources = vec ! [
1394+ ( r#""asd""# , 1 ) ,
1395+ ( "true" , 0 ) ,
1396+ ( "1" , 10 ) ,
1397+ ( r#"{"a":1,"b":2}"# , 20 ) ,
1398+ ] ;
1399+ for ( json, index) in sources {
1400+ {
1401+ let mut buf = Vec :: new ( ) ;
1402+ let result = delete_by_index ( json. as_bytes ( ) , index, & mut buf) ;
1403+
1404+ assert ! ( result. is_err( ) ) ;
1405+ assert ! ( matches!( result. unwrap_err( ) , Error :: InvalidJsonType ) ) ;
1406+ }
1407+ {
1408+ let json = parse_value ( json. as_bytes ( ) ) . unwrap ( ) . to_vec ( ) ;
1409+ let mut buf = Vec :: new ( ) ;
1410+
1411+ let result = delete_by_index ( & json, index, & mut buf) ;
1412+
1413+ assert ! ( result. is_err( ) ) ;
1414+ assert ! ( matches!( result. unwrap_err( ) , Error :: InvalidJsonType ) ) ;
1415+ }
1416+ }
1417+ }
1418+
12931419fn init_object < ' a > ( entries : Vec < ( & str , Value < ' a > ) > ) -> Value < ' a > {
12941420 let mut map = BTreeMap :: new ( ) ;
12951421 for ( key, val) in entries {
0 commit comments