1 use { 2 bindings::{ 3 exports::local::local::short_reads::{self, Guest, GuestThing}, 4 wit_stream, 5 }, 6 wit_bindgen::{StreamReader, StreamResult, rt::async_support}, 7 }; 8 9 mod bindings { 10 wit_bindgen::generate!({ 11 path: "../misc/component-async-tests/wit", 12 world: "short-reads-guest", 13 }); 14 15 use super::Component; 16 export!(Component); 17 } 18 19 struct Thing { 20 value: String, 21 } 22 23 impl GuestThing for Thing { 24 fn new(value: String) -> Self { 25 Self { value } 26 } 27 28 async fn get(&self) -> String { 29 self.value.clone() 30 } 31 } 32 33 struct Component; 34 35 impl Guest for Component { 36 type Thing = Thing; 37 38 async fn short_reads( 39 mut stream: StreamReader<short_reads::Thing>, 40 ) -> StreamReader<short_reads::Thing> { 41 let (mut tx, rx) = wit_stream::new(); 42 43 async_support::spawn(async move { 44 // Read the things one at a time, forcing the host to re-take 45 // ownership of any unwritten items between writes. 46 let mut things = Vec::new(); 47 loop { 48 let (status, buffer) = stream.read(Vec::with_capacity(1)).await; 49 match status { 50 StreamResult::Complete(_) => { 51 things.extend(buffer); 52 } 53 StreamResult::Dropped => break, 54 StreamResult::Cancelled => unreachable!(), 55 } 56 } 57 // Write the things all at once. The host will read them only one 58 // at a time, forcing us to re-take ownership of any unwritten 59 // items between writes. 60 things = tx.write_all(things).await; 61 assert!(things.is_empty()); 62 }); 63 64 rx 65 } 66 } 67 68 // Unused function; required since this file is built as a `bin`: 69 fn main() {} 70