71 lines
1.6 KiB
Rust
71 lines
1.6 KiB
Rust
![]() |
extern crate serde;
|
||
|
extern crate serde_json;
|
||
|
extern crate wasm_bindgen;
|
||
|
extern crate web_sys;
|
||
|
#[macro_use]
|
||
|
extern crate serde_derive;
|
||
|
|
||
|
use wasm_bindgen::prelude::*;
|
||
|
|
||
|
#[wasm_bindgen]
|
||
|
#[derive(Deserialize)]
|
||
|
pub struct Input {
|
||
|
pub screen_width: f32,
|
||
|
pub screen_height: f32,
|
||
|
pub mouse_x: f32,
|
||
|
pub mouse_y: f32,
|
||
|
}
|
||
|
|
||
|
#[derive(Serialize)]
|
||
|
#[serde(rename_all = "snake_case")]
|
||
|
enum TextAlign {
|
||
|
Start,
|
||
|
Center,
|
||
|
End,
|
||
|
}
|
||
|
|
||
|
#[derive(Serialize)]
|
||
|
#[serde(rename_all = "snake_case", tag = "kind")]
|
||
|
enum PaintCmd {
|
||
|
Clear {
|
||
|
fill_style: String,
|
||
|
},
|
||
|
RoundedRect {
|
||
|
fill_style: String,
|
||
|
pos: [f32; 2],
|
||
|
size: [f32; 2],
|
||
|
radius: f32,
|
||
|
},
|
||
|
Text {
|
||
|
fill_style: String,
|
||
|
font: String,
|
||
|
pos: [f32; 2],
|
||
|
text: String,
|
||
|
text_align: TextAlign,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
#[wasm_bindgen]
|
||
|
pub fn show_gui(input_json: &str) -> String {
|
||
|
let input: Input = serde_json::from_str(input_json).unwrap();
|
||
|
let commands = [
|
||
|
PaintCmd::Clear {
|
||
|
fill_style: "#44444400".to_string(),
|
||
|
},
|
||
|
PaintCmd::RoundedRect {
|
||
|
fill_style: "#1111ff".to_string(),
|
||
|
pos: [100.0, 100.0],
|
||
|
radius: 40.0,
|
||
|
size: [200.0, 200.0],
|
||
|
},
|
||
|
PaintCmd::Text {
|
||
|
fill_style: "#11ff00".to_string(),
|
||
|
font: "14px Palatino".to_string(),
|
||
|
pos: [200.0, 32.0],
|
||
|
text: format!("Mouse pos: {} {}", input.mouse_x, input.mouse_y),
|
||
|
text_align: TextAlign::Center,
|
||
|
},
|
||
|
];
|
||
|
serde_json::to_string(&commands).unwrap()
|
||
|
}
|