frame_buffer_wasmtime/
lib.rs1use crate::wasi_gfx::frame_buffer::frame_buffer;
6use wasmtime::component::{HasData, Resource};
7
8wasmtime::component::bindgen!({
9 world: "wasi-gfx:frame-buffer/imports",
10 imports: {
11 default: trappable,
12 },
13 with: {
14 "wasi-gfx:frame-buffer/frame-buffer.buffer": GfxBuffer,
15 },
16});
17
18pub trait HasBuffer: Send {
22 fn get_buffer(&self) -> wasmtime::Result<Vec<u8>>;
23 fn set_buffer(&mut self, value: &[u8]) -> wasmtime::Result<()>;
24}
25pub struct GfxBuffer {
26 pub buffer: Box<dyn HasBuffer>,
27}
28
29pub fn add_to_linker<T>(l: &mut wasmtime::component::Linker<T>) -> wasmtime::Result<()>
31where
32 T: FrameBufferCtxView,
33{
34 wasi_gfx::frame_buffer::frame_buffer::add_to_linker::<_, HasFrameBufferCtx>(
35 l,
36 T::frame_buffer_ctx,
37 )?;
38 Ok(())
39}
40
41pub trait FrameBufferCtxView {
42 fn frame_buffer_ctx<'a>(&'a mut self) -> FrameBufferCtx<'a>;
43}
44
45pub struct FrameBufferCtx<'a> {
46 pub table: &'a mut wasmtime_wasi::ResourceTable,
47}
48
49struct HasFrameBufferCtx;
50
51impl HasData for HasFrameBufferCtx {
52 type Data<'a> = FrameBufferCtx<'a>;
53}
54
55impl<'a> frame_buffer::Host for FrameBufferCtx<'a> {}
57
58impl<'a> frame_buffer::HostBuffer for FrameBufferCtx<'a> {
59 fn get_with_copy(&mut self, buffer: Resource<GfxBuffer>) -> wasmtime::Result<Vec<u8>> {
60 let buffer = self.table.get(&buffer)?;
61 let buffer = buffer.buffer.get_buffer()?;
62 Ok(buffer)
63 }
64
65 fn set_with_copy(&mut self, buffer: Resource<GfxBuffer>, val: Vec<u8>) -> wasmtime::Result<()> {
66 let buffer = self.table.get_mut(&buffer)?;
67 buffer.buffer.set_buffer(&val).unwrap();
68 Ok(())
69 }
70
71 fn drop(&mut self, frame_buffer: Resource<GfxBuffer>) -> wasmtime::Result<()> {
72 let _frame_buffer = self.table.delete(frame_buffer)?;
73 Ok(())
74 }
75}