@@ -1353,78 +1353,15 @@ mod tests {
1353
1353
assert ! ( context. no_unhandled_errors( ) ) ;
1354
1354
}
1355
1355
1356
- #[ derive( Clone ) ]
1356
+ #[ derive( Clone , JoinedValue ) ]
1357
+ #[ buffers( buffer_struct_name = TestJoinedValueJsonBuffers ) ]
1357
1358
struct TestJoinedValueJson {
1358
1359
integer : i64 ,
1359
1360
float : f64 ,
1361
+ #[ buffers( buffer_type = JsonBuffer ) ]
1360
1362
json : JsonMessage ,
1361
1363
}
1362
1364
1363
- #[ derive( Clone ) ]
1364
- struct TestJoinedValueJsonBuffers {
1365
- integer : Buffer < i64 > ,
1366
- float : Buffer < f64 > ,
1367
- json : JsonBuffer ,
1368
- }
1369
-
1370
- impl JoinedValue for TestJoinedValueJson {
1371
- type Buffers = TestJoinedValueJsonBuffers ;
1372
- }
1373
-
1374
- impl BufferMapLayout for TestJoinedValueJsonBuffers {
1375
- fn buffer_list ( & self ) -> smallvec:: SmallVec < [ AnyBuffer ; 8 ] > {
1376
- use smallvec:: smallvec;
1377
- smallvec ! [
1378
- self . integer. as_any_buffer( ) ,
1379
- self . float. as_any_buffer( ) ,
1380
- self . json. as_any_buffer( ) ,
1381
- ]
1382
- }
1383
-
1384
- fn try_from_buffer_map ( buffers : & BufferMap ) -> Result < Self , IncompatibleLayout > {
1385
- let mut compatibility = IncompatibleLayout :: default ( ) ;
1386
- let integer = compatibility. require_message_type :: < i64 > ( "integer" , buffers) ;
1387
- let float = compatibility. require_message_type :: < f64 > ( "float" , buffers) ;
1388
- let json = compatibility. require_buffer_type :: < JsonBuffer > ( "json" , buffers) ;
1389
-
1390
- let Ok ( integer) = integer else {
1391
- return Err ( compatibility) ;
1392
- } ;
1393
- let Ok ( float) = float else {
1394
- return Err ( compatibility) ;
1395
- } ;
1396
- let Ok ( json) = json else {
1397
- return Err ( compatibility) ;
1398
- } ;
1399
-
1400
- Ok ( Self {
1401
- integer,
1402
- float,
1403
- json,
1404
- } )
1405
- }
1406
- }
1407
-
1408
- impl crate :: Joined for TestJoinedValueJsonBuffers {
1409
- type Item = TestJoinedValueJson ;
1410
-
1411
- fn pull (
1412
- & self ,
1413
- session : Entity ,
1414
- world : & mut World ,
1415
- ) -> Result < Self :: Item , crate :: OperationError > {
1416
- let integer = self . integer . pull ( session, world) ?;
1417
- let float = self . float . pull ( session, world) ?;
1418
- let json = self . json . pull ( session, world) ?;
1419
-
1420
- Ok ( TestJoinedValueJson {
1421
- integer,
1422
- float,
1423
- json,
1424
- } )
1425
- }
1426
- }
1427
-
1428
1365
#[ test]
1429
1366
fn test_try_join_json ( ) {
1430
1367
let mut context = TestingContext :: minimal_plugins ( ) ;
@@ -1502,4 +1439,43 @@ mod tests {
1502
1439
let expected_json = TestMessage :: new ( ) ;
1503
1440
assert_eq ! ( deserialized_json, expected_json) ;
1504
1441
}
1442
+
1443
+ #[ test]
1444
+ fn test_select_buffers_json ( ) {
1445
+ let mut context = TestingContext :: minimal_plugins ( ) ;
1446
+
1447
+ let workflow = context. spawn_io_workflow ( |scope, builder| {
1448
+ let buffer_integer = builder. create_buffer :: < i64 > ( BufferSettings :: default ( ) ) ;
1449
+ let buffer_float = builder. create_buffer :: < f64 > ( BufferSettings :: default ( ) ) ;
1450
+ let buffer_json =
1451
+ JsonBuffer :: from ( builder. create_buffer :: < TestMessage > ( BufferSettings :: default ( ) ) ) ;
1452
+
1453
+ let buffers =
1454
+ TestJoinedValueJson :: select_buffers ( buffer_integer, buffer_float, buffer_json) ;
1455
+
1456
+ scope. input . chain ( builder) . fork_unzip ( (
1457
+ |chain : Chain < _ > | chain. connect ( buffers. integer . input_slot ( ) ) ,
1458
+ |chain : Chain < _ > | chain. connect ( buffers. float . input_slot ( ) ) ,
1459
+ |chain : Chain < _ > | {
1460
+ chain. connect ( buffers. json . downcast_for_message ( ) . unwrap ( ) . input_slot ( ) )
1461
+ } ,
1462
+ ) ) ;
1463
+
1464
+ builder. join ( buffers) . connect ( scope. terminate ) ;
1465
+ } ) ;
1466
+
1467
+ let mut promise = context. command ( |commands| {
1468
+ commands
1469
+ . request ( ( 5_i64 , 3.14_f64 , TestMessage :: new ( ) ) , workflow)
1470
+ . take_response ( )
1471
+ } ) ;
1472
+
1473
+ context. run_with_conditions ( & mut promise, Duration :: from_secs ( 2 ) ) ;
1474
+ let value: TestJoinedValueJson = promise. take ( ) . available ( ) . unwrap ( ) ;
1475
+ assert_eq ! ( value. integer, 5 ) ;
1476
+ assert_eq ! ( value. float, 3.14 ) ;
1477
+ let deserialized_json: TestMessage = serde_json:: from_value ( value. json ) . unwrap ( ) ;
1478
+ let expected_json = TestMessage :: new ( ) ;
1479
+ assert_eq ! ( deserialized_json, expected_json) ;
1480
+ }
1505
1481
}
0 commit comments