feat: wit-bindgen-sample

This commit is contained in:
2022-07-23 10:48:31 +08:00
parent a116b1c2e6
commit 7d769d3a0f
5 changed files with 31 additions and 22 deletions

View File

@@ -1,3 +1,12 @@
Requires:
* Rust (with target wasm32-unknown-unknown)
Check out wit-bindgen:
```shell
git clone https://github.com/bytecodealliance/wit-bindgen.git
```

View File

@@ -14,9 +14,9 @@ impl FnResult {
}
}
pub fn success(result: String) -> Self {
pub fn success(result: impl Into<String>) -> Self {
FnResult {
result: Some(result),
result: Some(result.into()),
error: None,
}
}

View File

@@ -96,16 +96,16 @@ pub fn do_fetch(params: &str) -> FnResult {
let mut result_map = Map::new();
result_map.insert("status".to_string(), Value::Number(Number::from(status)));
let mut header_map = Map::new();
let mut headers_map = Map::new();
for (k, v) in headers {
let header_key = k.map(|n| n.as_str().to_string()).unwrap_or_else(|| "".to_string());
let header_value = match v.to_str() {
Err(_) => continue,
Ok(v) => v.to_string(),
};
header_map.insert(header_key, Value::String(header_value));
headers_map.insert(header_key, Value::String(header_value));
}
result_map.insert("headers".to_string(), Value::Object(header_map));
result_map.insert("headers".to_string(), Value::Object(headers_map));
result_map.insert("body".to_string(), Value::String(String::from_utf8_lossy(&body_buff).to_string()));
FnResult::success(format!("{}", Value::Object(result_map)))

View File

@@ -30,15 +30,15 @@ fn main() -> Result<()> {
)?;
let a = exports.eval_javascript(&mut store, r##"
function hi(name) { return "hi: " + name; }
let a = [];
a.push(fetch('https://hatter.ink/util/print_request.action'));
for (let i = 0; i < 3; i++) { a.push(i); }
a.push({
id: 1, name: 'hatter'
});
a.push(hi('001'));
a.push(hi('002'));
// let a = fetch('https://hatter.ink/util/print_request.action');
// let a = [];
// a.push(fetch('https://hatter.ink/util/print_request.action'));
// for (let i = 0; i < 3; i++) { a.push(i); }
// a.push({
// id: 1, name: 'hatter'
// });
// a.push(hi('001'));
// a.push(hi('002'));
let a = fetch('https://hatter.ink/util/print_request.action');
JSON.stringify(a)
// a
"##);

View File

@@ -9,15 +9,12 @@ struct Exports;
impl exports::Exports for Exports {
fn eval_javascript(script: String) -> String {
let mut ctx = Context::default();
ctx.register_global_function("fetch", 0, fetch_fn);
ctx.register_global_function("fetch", 0, do_fetch);
let o = match ctx.eval(&script) {
JsResult::Ok(o) => o,
JsResult::Err(o) => o,
};
format!("{}", o.to_json(&mut ctx).unwrap())
// let a = container::fetch("");
// let a = fetch_from_host("<CONFIG>");
// format!("eval: {}, fetched: {}", s, a)
format!("{}", o.to_json(&mut ctx).expect("To JSON error"))
}
}
@@ -27,14 +24,17 @@ struct FetchResult {
result: Option<String>,
}
fn fetch_fn(_: &JsValue, args: &[JsValue], ctx: &mut Context) -> JsResult<JsValue> {
fn do_fetch(_: &JsValue, args: &[JsValue], ctx: &mut Context) -> JsResult<JsValue> {
if args.is_empty() {
return JsResult::Err(JsValue::String(JsString::from("Requires at least one argument")));
}
let mut fetch_params_map = Map::new();
fetch_params_map.insert("url".to_string(), args[0].to_json(ctx).expect("error"));
if args.len() > 1 {
fetch_params_map.insert("params".to_string(), args[1].to_json(ctx).expect("error"));
}
let fetch_params = format!("{}", Value::Object(fetch_params_map));
let fetch_result_string = container::fetch(&fetch_params);
let fetch_result: FetchResult = serde_json::from_str(&fetch_result_string).expect("from str error");
if let Some(result) = fetch_result.result {
@@ -42,5 +42,5 @@ fn fetch_fn(_: &JsValue, args: &[JsValue], ctx: &mut Context) -> JsResult<JsValu
let v = JsValue::from_json(&r, ctx).unwrap();
return JsResult::Ok(v);
}
JsResult::Err(JsValue::String(JsString::from(format!("Invoke fetch error: {}", fetch_result.error.unwrap_or("".to_string())))))
JsResult::Err(JsValue::String(JsString::from(format!("Invoke fetch error: {}", fetch_result.error.unwrap_or("<unknown>".to_string())))))
}