exp: client host and demo app using wasm/wasmtime
diff --git a/apps/client/hello/call_host/src/lib.rs b/apps/client/hello/call_host/src/lib.rs
new file mode 100644
index 0000000..417445c
--- /dev/null
+++ b/apps/client/hello/call_host/src/lib.rs
@@ -0,0 +1,117 @@
+use std::error;
+use tui::{
+ layout::{Alignment},
+ widgets::{Block, BorderType, Borders},
+ Terminal,
+};
+
+
+use core::result::Result;
+use std::io::Error;
+use tui::backend::Backend;
+use tui::buffer::Cell;
+use tui::layout::Rect;
+
+extern "C" {
+ fn cursorHide();
+ fn cursorShow();
+ fn cursorSet(x: u16, y: u16);
+ fn clearScreen();
+ fn getSize() -> (i32, i32, i32, i32);
+ fn flush();
+ fn draw(x: u16, y: u16);
+}
+
+struct HostBackend {}
+
+impl Backend for HostBackend {
+ fn draw<'a, I>(&mut self, content: I) -> Result<(), Error>
+ where
+ I: Iterator<Item = (u16, u16, &'a Cell)>,
+ {
+ for i in content {
+ let x: u16 = i.0;
+ let y: u16 = i.1;
+ unsafe { draw(x, y) }
+ }
+ Ok(())
+ }
+
+ fn hide_cursor(&mut self) -> Result<(), Error> {
+ unsafe { cursorHide() }
+ Ok(())
+ }
+
+ fn show_cursor(&mut self) -> Result<(), Error> {
+ unsafe { cursorShow() }
+ Ok(())
+ }
+
+ fn get_cursor(&mut self) -> Result<(u16, u16), Error> {
+ Ok((100, 100))
+ }
+
+ fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), Error> {
+ unsafe { cursorSet(x, y) }
+ Ok(())
+ }
+
+ fn clear(&mut self) -> Result<(), Error> {
+ unsafe { clearScreen() }
+ Ok(())
+ }
+
+ fn size(&self) -> Result<Rect, Error> {
+ let ws: (i32, i32, i32, i32);
+ unsafe { ws = getSize(); }
+ Ok(Rect {
+ x: ws.0 as u16,
+ y: ws.1 as u16,
+ width: ws.2 as u16,
+ height: ws.3 as u16,
+ })
+ // Ok(Rect {
+ // x: 0,
+ // y: 0,
+ // width: 50,
+ // height: 50,
+ // })
+ }
+
+ fn flush(&mut self) -> Result<(), Error> {
+ unsafe { flush() }
+ Ok(())
+ }
+}
+
+fn main() -> Result<(), Box<dyn error::Error>> {
+ let backend = HostBackend{};
+ let mut terminal = Terminal::new(backend)?;
+ let mut i: i32 = 0;
+ loop {
+ terminal.draw(|f| {
+ let size = f.size();
+ let block = Block::default()
+ .borders(Borders::ALL)
+ .title("Main block with round corners")
+ .title_alignment(Alignment::Center)
+ .border_type(BorderType::Rounded);
+ f.render_widget(block, size);
+ })?;
+ i = i + 1;
+ if i > 1000 {
+ break;
+ }
+ }
+ terminal.show_cursor()?;
+
+ Ok(())
+}
+
+struct Unused<T>(T);
+
+#[no_mangle]
+pub extern "C" fn run() {
+ // unsafe { cursorSet(10, 10) }
+ Unused(main());
+}